如何读取本地SQL文件为pandas DataFrame并替换查询中的日期变量
正确实现代码及说明
你原来的写法存在两个核心问题:
- 直接把文件路径赋值给了查询语句变量,没有实际读取SQL文件的内容
- Python字符串是不可变类型,
replace操作不会修改原变量,需要重新赋值给新变量
实现1:字符串替换方案(适合简单场景)
首先修改你的query.sql文件内容,将占位符用大括号包裹方便识别:
SELECT * FROM table where date > '{date_string}'
Python端代码:
import pandas as pd # 读取SQL文件内容,路径前加r避免Windows转义符报错 sql_file_path = r'C:\Users\Admin\Desktop\Python\Open Source\query.sql' with open(sql_file_path, 'r', encoding='utf-8') as f: raw_sql = f.read() # 单日期执行示例 startDate_sql = '2024-01-01' # 你已经赋值的日期变量 processed_sql = raw_sql.replace('{date_string}', startDate_sql) query_result = pd.read_sql(processed_sql, conn) # 循环遍历日期列表示例 date_list = ['2024-01-01', '2024-02-01', '2024-03-01'] # 你的日期列表 all_result = [] for startDate_sql in date_list: current_sql = raw_sql.replace('{date_string}', startDate_sql) df = pd.read_sql(current_sql, conn) all_result.append(df) # 合并所有查询结果为一个DataFrame(可选) final_df = pd.concat(all_result, ignore_index=True)
实现2:参数化查询方案(更安全,推荐)
不需要手动处理日期的引号,也能避免SQL注入风险,兼容性更好。
修改query.sql文件内容,占位符不用加引号:
SELECT * FROM table where date > %(date_string)s
Python端代码:
import pandas as pd sql_file_path = r'C:\Users\Admin\Desktop\Python\Open Source\query.sql' with open(sql_file_path, 'r', encoding='utf-8') as f: raw_sql = f.read() # 循环执行示例 date_list = ['2024-01-01', '2024-02-01', '2024-03-01'] all_result = [] for startDate_sql in date_list: # 通过params参数直接传值,不需要手动替换字符串 df = pd.read_sql(raw_sql, conn, params={"date_string": startDate_sql}) all_result.append(df) final_df = pd.concat(all_result, ignore_index=True)
注意事项
- 读取SQL文件时如果出现中文乱码,可以将
encoding='utf-8'修改为encoding='gbk'适配Windows系统默认编码 - 如果你用pyodbc驱动连接SSMS,参数占位符需要改为
?,参数传递改为params=(startDate_sql,)即可
内容的提问来源于stack exchange,提问作者Tukki
相关产品推荐
相关产品推荐

