Skip to content

jurnlee/mysql-exportor

Repository files navigation

MySQL Exporter

MySQL数据库导出工具 - 将MySQL数据导出为CSV文件,支持交互式和命令行两种模式,具有分批导出、进度显示等实用功能。

📁 项目结构

mysql-csv-exportor/
├── main.py              # 主程序入口
├── database.py          # 数据库连接和查询模块
├── csv_exporter.py      # CSV导出模块(支持分批导出)
├── cli.py               # 交互式命令行界面
├── config.yaml          # 配置文件
└── requirements.txt     # 依赖包

✨ 主要功能

  1. 双模式支持

    • 交互式模式:运行 python main.py 进入向导式操作进行配置
    • 命令行模式:直接通过参数指定所有配置
  2. 分批导出大数据

    • 使用生成器模式,避免内存溢出
    • 可配置批次大小(默认2000行/批)
    • 实时进度显示
  3. 灵活的数据导出

    • 支持自定义SQL查询
    • 支持指定表导出
    • 支持列选择和WHERE条件过滤
    • 支持LIMIT限制行数
  4. 友好的交互界面

    • 密码输入不回显
    • 进度条实时显示
    • 数据预览功能
    • 彩色输出和清晰的信息提示
  5. 环境变量支持

    • 支持通过环境变量配置数据库连接
    • 支持通过环境变量覆盖配置文件设置

🚀 快速开始

1. 安装依赖

pip install -r requirements.txt

2. 运行程序

交互式模式(推荐首次使用)

python main.py

命令行模式

python main.py -H localhost -P 3306 -u root -p your_password -d mydb -q "SELECT * FROM users"

📖 详细使用说明

交互式模式

运行程序后,按照提示输入:

  1. 数据库连接信息(地址、端口、用户名、密码、数据库名、字符集)
  2. 选择查询方式(输入SQL或选择表导出)
  3. 根据选择输入SQL查询或选择要导出的表
  4. 设置导出参数(输出文件、批次大小、分隔符等)
  5. 确认并执行导出

命令行模式

基本用法

# 导出整个表
python main.py -H localhost -u root -p password -d mydb -t users -o output.csv

带条件的查询导出

python main.py -H localhost -u root -p password -d mydb \
  -q "SELECT id, name, email FROM users WHERE created_at > '2024-01-01'" \
  -o new_users.csv

分批导出大数据

python main.py -H localhost -u root -p password -d mydb \
  -q "SELECT * FROM large_table" \
  --batch-size 50000 \
  --max-rows 1000000 \
  -o large_data.csv

预览查询结果

python main.py -H localhost -u root -p password -d mydb \
  -q "SELECT * FROM users" \
  --preview \
  --preview-rows 10

列出所有表

python main.py -H localhost -u root -p password -d mydb --list-tables

命令行参数参考

参数 说明 默认值
-H, --host 数据库地址 localhost
-P, --port 端口 3306
-u, --user 用户名 root
-p, --password 密码 -
-D, --database 数据库名 -
-q, --query SQL查询语句 -
-t, --table 表名 -
--where WHERE条件(仅与--table使用) -
--columns 导出的列,逗号分隔 *
-o, --output 输出文件路径 自动生成
--batch-size 批次大小 10000
--max-rows 最大行数 0(不限制)
--no-header 不包含表头 false
--delimiter CSV分隔符 ,
--encoding 文件编码 utf-8
--preview 预览模式 -
--preview-rows 预览行数 5
--list-tables 列出所有表 -
--test-connection 测试数据库连接 -
-c, --config 配置文件路径 config.yaml
--charset 数据库字符集 utf8mb4
-v, --version 显示版本 -

⚙️ 配置说明

配置文件(config.yaml)

可以通过 config.yaml 文件进行默认配置:

# 数据库连接设置
database:
  host: "localhost"
  port: 3306
  username: "root"
  password: ""
  database: ""
  charset: "utf8mb4"

# 导出设置
export:
  batch_size: 2000
  output_file: "exported_data.csv"
  delimiter: ","
  quotechar: '"'
  encoding: "utf-8"
  include_header: true

# 查询设置
query:
  max_rows: 0
  timeout: 300

环境变量支持

可以通过环境变量覆盖配置文件设置:

环境变量 对应配置
MYSQL_HOST database.host
MYSQL_PORT database.port
MYSQL_USER database.username
MYSQL_PASSWORD database.password
MYSQL_DATABASE database.database
MYSQL_QUERY_TIMEOUT query.timeout
MYSQL_MAX_ROWS query.max_rows

设置环境变量示例:

# Linux/Mac
export MYSQL_HOST=192.168.1.100
export MYSQL_USER=admin
export MYSQL_PASSWORD=your_password

# Windows
set MYSQL_HOST=192.168.1.100
set MYSQL_USER=admin
set MYSQL_PASSWORD=your_password

📋 使用示例

示例1:导出单个表

python main.py -H 192.168.1.100 -u admin -p 123456 -d shopdb -t orders -o orders.csv

示例2:导出指定列并添加条件

python main.py -H localhost -u root -p password -d mydb \
  -t users \
  --columns "id,name,email,created_at" \
  --where "status = 'active'" \
  -o active_users.csv

示例3:复杂SQL查询导出

python main.py -H localhost -u root -p password -d mydb \
  -q "SELECT u.name, COUNT(o.id) as order_count, SUM(o.total) as total_amount \
      FROM users u LEFT JOIN orders o ON u.id = o.user_id \
      GROUP BY u.id \
      HAVING order_count > 0" \
  -o user_summary.csv

示例4:限制导出行数

python main.py -H localhost -u root -p password -d mydb \
  -q "SELECT * FROM logs" \
  --max-rows 100000 \
  -o logs.csv

示例5:使用配置文件

python main.py -c production.yaml -q "SELECT * FROM users"

🔧 技术特点

分批导出机制

程序使用生成器模式从数据库分批获取数据,避免一次性加载所有数据到内存:

  1. 每次从数据库获取指定批次大小的数据(默认10000行)
  2. 将批次数据写入CSV文件
  3. 释放内存,继续获取下一批数据
  4. 实时显示导出进度

这种方法可以处理数百万行的大型数据集,而不会耗尽服务器或客户端的内存。

数据类型处理

工具会自动处理各种MySQL数据类型:

  • NULL 值转换为空字符串
  • 日期/时间类型转换为标准格式
  • 二进制数据尝试解码为文本
  • 布尔值转换为 0/1

编码支持

  • 输入编码:支持 utf8mb4(MySQL推荐)
  • 输出编码:默认 utf-8,支持其他常见编码

🛠️ 依赖说明

主要依赖包:

  • mysql-connector-python - MySQL数据库连接
  • PyYAML - 配置文件解析
  • psutil - 系统资源检测(用于自动优化批次大小)

📝 注意事项

  1. 密码安全:建议使用环境变量或配置文件管理密码,避免在命令行中暴露密码
  2. 大数据导出:对于超大数据集,建议使用分批导出并合理设置批次大小
  3. 字符集:确保数据库字符集与导出编码匹配,避免乱码
  4. 权限:运行程序的用户需要对目标数据库有SELECT权限

📄 许可证

MIT License

🤝 贡献

欢迎提交Issue和Pull Request!

About

MySQL数据库快捷导出工具

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages