You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取本地SQL文件为pandas DataFrame并替换查询中的日期变量

正确实现代码及说明

你原来的写法存在两个核心问题:

  1. 直接把文件路径赋值给了查询语句变量,没有实际读取SQL文件的内容
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:18:03