MySQL数据库导出工具 - 将MySQL数据导出为CSV文件,支持交互式和命令行两种模式,具有分批导出、进度显示等实用功能。
mysql-csv-exportor/
├── main.py # 主程序入口
├── database.py # 数据库连接和查询模块
├── csv_exporter.py # CSV导出模块(支持分批导出)
├── cli.py # 交互式命令行界面
├── config.yaml # 配置文件
└── requirements.txt # 依赖包
-
双模式支持
- 交互式模式:运行
python main.py进入向导式操作进行配置 - 命令行模式:直接通过参数指定所有配置
- 交互式模式:运行
-
分批导出大数据
- 使用生成器模式,避免内存溢出
- 可配置批次大小(默认2000行/批)
- 实时进度显示
-
灵活的数据导出
- 支持自定义SQL查询
- 支持指定表导出
- 支持列选择和WHERE条件过滤
- 支持LIMIT限制行数
-
友好的交互界面
- 密码输入不回显
- 进度条实时显示
- 数据预览功能
- 彩色输出和清晰的信息提示
-
环境变量支持
- 支持通过环境变量配置数据库连接
- 支持通过环境变量覆盖配置文件设置
pip install -r requirements.txt交互式模式(推荐首次使用)
python main.py命令行模式
python main.py -H localhost -P 3306 -u root -p your_password -d mydb -q "SELECT * FROM users"运行程序后,按照提示输入:
- 数据库连接信息(地址、端口、用户名、密码、数据库名、字符集)
- 选择查询方式(输入SQL或选择表导出)
- 根据选择输入SQL查询或选择要导出的表
- 设置导出参数(输出文件、批次大小、分隔符等)
- 确认并执行导出
# 导出整个表
python main.py -H localhost -u root -p password -d mydb -t users -o output.csvpython 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.csvpython main.py -H localhost -u root -p password -d mydb \
-q "SELECT * FROM large_table" \
--batch-size 50000 \
--max-rows 1000000 \
-o large_data.csvpython main.py -H localhost -u root -p password -d mydb \
-q "SELECT * FROM users" \
--preview \
--preview-rows 10python 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 文件进行默认配置:
# 数据库连接设置
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_passwordpython main.py -H 192.168.1.100 -u admin -p 123456 -d shopdb -t orders -o orders.csvpython main.py -H localhost -u root -p password -d mydb \
-t users \
--columns "id,name,email,created_at" \
--where "status = 'active'" \
-o active_users.csvpython 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.csvpython main.py -H localhost -u root -p password -d mydb \
-q "SELECT * FROM logs" \
--max-rows 100000 \
-o logs.csvpython main.py -c production.yaml -q "SELECT * FROM users"程序使用生成器模式从数据库分批获取数据,避免一次性加载所有数据到内存:
- 每次从数据库获取指定批次大小的数据(默认10000行)
- 将批次数据写入CSV文件
- 释放内存,继续获取下一批数据
- 实时显示导出进度
这种方法可以处理数百万行的大型数据集,而不会耗尽服务器或客户端的内存。
工具会自动处理各种MySQL数据类型:
NULL值转换为空字符串- 日期/时间类型转换为标准格式
- 二进制数据尝试解码为文本
- 布尔值转换为 0/1
- 输入编码:支持
utf8mb4(MySQL推荐) - 输出编码:默认
utf-8,支持其他常见编码
主要依赖包:
mysql-connector-python- MySQL数据库连接PyYAML- 配置文件解析psutil- 系统资源检测(用于自动优化批次大小)
- 密码安全:建议使用环境变量或配置文件管理密码,避免在命令行中暴露密码
- 大数据导出:对于超大数据集,建议使用分批导出并合理设置批次大小
- 字符集:确保数据库字符集与导出编码匹配,避免乱码
- 权限:运行程序的用户需要对目标数据库有SELECT权限
MIT License
欢迎提交Issue和Pull Request!