如何用Python循环执行SQL查询,按月递增日期并导出CSV
Python实现按月循环查询SQL并合并结果导出CSV
步骤说明与代码实现
首先确保安装所需依赖包:
pip install pandas sqlalchemy
(根据你的数据库类型,可能需要额外安装驱动:比如MySQL用mysqlclient,PostgreSQL用psycopg2-binary,SQL Server用pyodbc)
1. 生成目标日期序列
生成2015-01-01到2023-01-01之间每个月的第一天:
import pandas as pd from sqlalchemy import create_engine # 生成每月第一天的日期列表,格式转为字符串 date_list = pd.date_range(start='2015-01-01', end='2023-01-01', freq='MS').strftime('%Y-%m-%d').tolist()
2. 建立数据库连接
替换为你的数据库连接字符串,不同数据库的格式示例如下:
# MySQL: 'mysql+pymysql://用户名:密码@主机地址:端口/数据库名' # PostgreSQL: 'postgresql+psycopg2://用户名:密码@主机地址:端口/数据库名' # SQL Server: 'mssql+pyodbc://用户名:密码@ODBC数据源名' engine = create_engine('你的数据库连接字符串')
3. 循环执行查询并合并结果
使用参数化查询避免SQL注入,同时高效合并数据:
# 注意:如果你的列名确实是带空格的`start date`,需要根据数据库转义,比如MySQL用`start date`,SQL Server用[start date] sql_template = "SELECT * FROM db WHERE `start date` = %s" # 用列表存储每个查询结果,最后一次性合并更高效 df_list = [] for target_date in date_list: # 执行参数化查询 current_df = pd.read_sql(sql_template, engine, params=(target_date,)) df_list.append(current_df) # 合并所有DataFrame final_df = pd.concat(df_list, ignore_index=True)
4. 导出为CSV文件
# 导出时忽略索引,避免生成额外列 final_df.to_csv('合并结果.csv', index=False)
注意事项
- 列名转义:如果你的
start date列名包含空格,一定要用对应数据库的转义符包裹,否则会报错。 - 性能优化:如果数据量较大,建议先将每个查询结果存入列表再合并,比每次追加到DataFrame效率更高。
- 数据库驱动:确保已安装对应数据库的Python驱动,否则无法建立连接。
内容的提问来源于stack exchange,提问作者Sunny Ray
相关产品推荐
相关产品推荐

