1. 项目背景与核心需求
在日常数据处理工作中,我们经常需要将数据库中的大量数据导出到Excel文件中进行分析或共享。手动操作不仅效率低下,还容易出错。这个Python脚本就是为了解决这个痛点而设计的——它能自动连接数据库,批量查询数据,并按需导出为结构化的Excel文件。
我最初开发这个工具是为了应对每周需要从MySQL导出数十张报表的需求。手动操作每次要花2-3小时,还经常漏掉某些表。用这个脚本后,整个过程缩短到10分钟以内,准确率100%。现在它已经成为我们团队数据交付的标准流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案选型
2.1 数据库连接方案
Python中最常用的数据库连接库是:
- MySQL:PyMySQL/mysql-connector-python
- PostgreSQL:psycopg2
- SQL Server:pyodbc
- Oracle:cx_Oracle
我选择使用SQLAlchemy作为ORM层,因为它:
- 统一了不同数据库的接口
- 内置连接池管理
- 支持事务和批量操作
- 与Pandas无缝集成
python复制from sqlalchemy import create_engine
# 示例连接字符串
# MySQL: mysql+pymysql://user:pass@host:port/db
# PostgreSQL: postgresql+psycopg2://user:pass@host:port/db
engine = create_engine('mysql+pymysql://user:password@localhost:3306/dbname')
2.2 数据处理与导出方案
Pandas是数据处理的首选库,因为它:
- 内置强大的DataFrame结构
- 支持从SQL直接读取数据
- 提供丰富的Excel导出选项
- 处理大数据集效率高
python复制import pandas as pd
# 从数据库读取数据到DataFrame
df = pd.read_sql('SELECT * FROM table_name', con=engine)
# 导出到Excel
df.to_excel('output.xlsx', index=False)
3. 完整实现方案
3.1 基础版本实现
python复制import pandas as pd
from sqlalchemy import create_engine
def export_tables_to_excel(db_uri, tables, output_dir):
"""
基础版导出功能
参数:
db_uri: 数据库连接字符串
tables: 要导出的表名列表
output_dir: 输出目录路径
"""
engine = create_engine(db_uri)
for table in tables:
try:
df = pd.read_sql(f'SELECT * FROM {table}', con=engine)
output_path = f'{output_dir}/{table}.xlsx'
df.to_excel(output_path, index=False)
print(f'成功导出表 {table} 到 {output_path}')
except Exception as e:
print(f'导出表 {table} 失败: {str(e)}')
3.2 高级功能扩展
3.2.1 分页查询大表
对于数据量大的表,一次性读取可能导致内存不足:
python复制def export_large_table(db_uri, table, output_path, chunk_size=10000):
"""分页导出大表数据"""
engine = create_engine(db_uri)
total_rows = pd.read_sql(f'SELECT COUNT(*) FROM {table}', con=engine).iloc[0,0]
with pd.ExcelWriter(output_path) as writer:
for offset in range(0, total_rows, chunk_size):
query = f'SELECT * FROM {table} LIMIT {chunk_size} OFFSET {offset}'
df = pd.read_sql(query, con=engine)
df.to_excel(writer, sheet_name=f'Page_{offset//chunk_size + 1}', index=False)
print(f'成功分页导出表 {table},共 {total_rows} 行数据')
3.2.2 多表合并导出
有时需要将多个表合并到一个Excel文件的不同sheet中:
python复制def export_multiple_sheets(db_uri, tables, output_path):
"""多表合并导出到一个Excel文件"""
engine = create_engine(db_uri)
with pd.ExcelWriter(output_path) as writer:
for table in tables:
df = pd.read_sql(f'SELECT * FROM {table}', con=engine)
df.to_excel(writer, sheet_name=table[:31], index=False) # sheet名最长31字符
print(f'成功导出 {len(tables)} 个表到 {output_path}')
3.2.3 条件筛选导出
支持自定
