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

如何在Python中将含格式化字符串的SQL文件读取为f-string传入pd.read_sql?

如何将含占位符的SQL文件转为f-string风格用于pd.read_sql()

问题描述

我有一个SQL文件query.sql,内容包含格式化占位符:

SELECT * FROM {table_name} WHERE LOAD_DT = '{load_date}'

希望读取该文件后直接当作f-string使用,传入pd.read_sql()方法。现有代码示例如下:

table_name = "PRODUCTS"
load_date = '15-08-2020'
# 其他局部变量

with open('query.sql','r') as file:
    sql_str = file.read()

不想使用.format(table_name, load_date)或.format(**locals()),因为有自定义SQL读取函数,不想每次传递参数列表;参数多的时候,位置参数既繁琐又容易出错。

解决方案

方法1:用eval动态生成f-string

直接利用eval()把读取到的SQL字符串转换成f-string并求值,自动从当前局部作用域获取变量:

table_name = "PRODUCTS"
load_date = '15-08-2020'

with open('query.sql','r') as file:
    sql_str = file.read()

# 将SQL字符串转为f-string并填充变量
formatted_sql = eval(f"f'''{sql_str}'''")

# 传入pd.read_sql执行
import pandas as pd
df = pd.read_sql(formatted_sql, your_db_connection)

注意:如果SQL内容里包含三个连续单引号('''),需要先转义,或者改用双引号包裹:eval(f'f"{sql_str}"'),同时要确保SQL中的双引号也做了转义处理。

方法2:用string.Template更安全替代

如果担心eval()的安全风险(比如SQL内容不可信的情况),可以改用string.Template,只需修改SQL文件的占位符格式:
修改query.sql内容为:

SELECT * FROM $table_name WHERE LOAD_DT = '$load_date'

然后代码中:

from string import Template

table_name = "PRODUCTS"
load_date = '15-08-2020'

with open('query.sql','r') as file:
    sql_str = file.read()

# 用当前局部变量填充模板
template = Template(sql_str)
formatted_sql = template.substitute(locals())

df = pd.read_sql(formatted_sql, your_db_connection)

这种方式不需要手动传递参数,直接通过locals()获取当前作用域的变量,既满足需求又避免了eval()的安全隐患。

内容的提问来源于stack exchange,提问作者rams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:40:33