Python中如何通过变量传递调用目标SQL变量实现格式化
问题描述
我有一个SQL模板变量mem_dep,直接在sql变量中使用它时可以正常生成正确的SQL语句;但当我将值为"mem_dep"的变量cat传入函数后,无法正常工作,仅输出cat的字符串值。
代码示例
mem_dep = """SELECT * FROM TABLE1 WHERE DT2_BUSINESS = '{Business_date}'""" cob = "20223456" cat = "mem_dep"
可正常运行的代码
def calc(): sql = mem_dep.format(Business_date = cob) print(sql)
调用与输出:
calc() # 调用函数 # 输出:SELECT * FROM TABLE1 WHERE DT2_BUSINESS = '20223456'
无法正常工作的代码
def calc(cat): sql = cat.format(Business_date = cob) print(sql)
调用与输出:
calc(cat) # 调用函数 # 输出:mem_dep
尝试过的无效代码
def calc(cat): tmp_sql = "{}".format(cat) sql = tmp_sql.format(Business_date = cob) print(sql)
调用与输出:
calc(cat) # 调用函数 # 输出:mem_dep
期望输出
SELECT * FROM TABLE1 WHERE DT2_BUSINESS = '20223456'
解决方案
问题核心是:你传递的cat是字符串"mem_dep",而非指向SQL模板的变量本身。Python不会自动将字符串解析为变量名,所以直接调用cat.format()只是在操作字符串"mem_dep",而非mem_dep变量存储的SQL模板内容。
以下是几种可行的解决方法:
方法1:直接传递模板变量而非字符串
把实际的模板变量mem_dep作为参数传入函数,而不是它的字符串名称:
def calc(template): sql = template.format(Business_date = cob) print(sql) calc(mem_dep) # 调用函数,直接传入模板变量
这种方式直接传递模板对象,能直接得到期望的输出,是最直观安全的方案。
方法2:用字典映射模板名称到模板变量
如果必须通过字符串名称引用模板,可以将所有SQL模板存入字典,通过键名获取对应模板:
# 定义模板字典统一管理 sql_templates = { "mem_dep": """SELECT * FROM TABLE1 WHERE DT2_BUSINESS = '{Business_date}'""" } cob = "20223456" cat = "mem_dep" def calc(cat): template = sql_templates.get(cat) if template: sql = template.format(Business_date = cob) print(sql) else: print(f"找不到名为{cat}的SQL模板") calc(cat) # 调用函数
这种方法便于维护多个SQL模板,避免直接操作变量名的风险。
方法3:通过globals()/locals()获取变量(不推荐)
可以通过全局/局部命名空间字典根据字符串获取变量,但这种方式不安全且不利于代码维护,仅作了解:
mem_dep = """SELECT * FROM TABLE1 WHERE DT2_BUSINESS = '{Business_date}'""" cob = "20223456" cat = "mem_dep" def calc(cat): template = globals().get(cat) if template: sql = template.format(Business_date = cob) print(sql) else: print(f"找不到名为{cat}的变量") calc(cat) # 调用函数
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

