Python使用字典替换字符串中的变量

Python使用字典替换字符串中的变量,python,string,dictionary,replace,Python,String,Dictionary,Replace,有类似的问题,但不完全是我的用例。我想使用字典引用替换字符串中的变量。在本例中,字符串是sql语句,但不太相关 带变量{}的SQL- qry = """SELECT SUM(CASE WHEN {{cols_1}} is null AND {{cols_2}} > 0 THEN 1 ELSE 0 END) AS output FROM mytable""" 字典- dict = {'cols_1': 'id',

有类似的问题,但不完全是我的用例。我想使用字典引用替换字符串中的变量。在本例中,字符串是sql语句,但不太相关

带变量{}的SQL-

qry = """SELECT
    SUM(CASE WHEN {{cols_1}} is null AND {{cols_2}} > 0 THEN 1 ELSE 0 END) AS output
    FROM mytable"""
字典-

dict = {'cols_1': 'id', 'cols_2': 'weather'}

那么结果会是这样的-

qry = """SELECT
    SUM(CASE WHEN id is null AND weather > 0 THEN 1 ELSE 0 END) AS output
    FROM mytable"""
我想用字典值替换cols_1和cols_2。但我不知道该怎么做

def substitute_values(qry, dict):

    if dict:
        qry = qry.replace('{{cols_1}}','{{cols_2}}'),dict[]
    
    return qry

在让我的轮子转了一圈后,感谢您的指导。

您可以使用
str.format
两次:

print(qry.format().format(**d))
输出:

SELECT
    SUM(CASE WHEN id is null AND weather > 0 THEN 1 ELSE 0 END) AS output
    FROM mytable

这就是你要找的吗

qry = """SELECT
    SUM(CASE WHEN {{cols_1}} is null AND {{cols_2}} > 0 THEN 1 ELSE 0 END) AS output
    FROM mytable"""

d = {'cols_1': 'id', 'cols_2': 'weather'}


for k,v in d.items():
    qry = qry.replace('{{'+k+'}}', v)
    
print(qry)
使用模板。简单:

from string import Template
qry = """SELECT SUM(CASE WHEN $cols_1 is null AND $cols_2 > 0 THEN 1 ELSE 0 END) AS output FROM mytable"""
dict = {'cols_1': 'id', 'cols_2': 'weather'}
qry = Template(qry).safe_substitute(dict)
此处的文档:

您可能应该在此处使用准备好的语句,而不是自己尝试绑定和连接语句。您的SQL版本是什么?好的,我想尝试一下这种方法,但很欣赏其他方法。PostgreSql您听说过SQL注入漏洞吗?你很有可能会创建一个。我只是在自动创建一个列值的引用。你为什么要使用两个括号<代码>{{cols_1}}?这应该是一个jinja模板吗?这有什么危险?这是我正在寻找的,但我遇到了一个错误
“tuple”对象没有属性“replace”
您是否将字典定义为
d
而不是
dict
?尽量不要使用
dict
作为变量名。另外,您的
qry
是字符串还是元组?试着运行我首先提供的全部代码来测试它是否有效。然后看看你是否以相同的形式提供了
qry
。好的,这对我来说很有用,但我是个新手,所以我想了解采用这种方法的问题/危险是什么?一定要阅读此文不,这不是重点。两者都同样糟糕。基本上,在SQL查询中替换另一个输入变量(可能由另一个用户输入)中的任何字符串都是错误的做法。$或者{{}不重要。$仅用于名为Template的特定库。它不能防止潜在的SQL注入。ELI5,为什么$cols_1比{{{cols_1}}好得多?仍在学习这是模板库所支持的。来自文档:“模板字符串支持基于$的替换,使用以下规则:”仍然可以使用模板放置{{}}而不是$。但是,这将是非常复杂的,因为您必须创建自己的模板类。此外,请检查以下内容:
from string import Template
qry = """SELECT SUM(CASE WHEN $cols_1 is null AND $cols_2 > 0 THEN 1 ELSE 0 END) AS output FROM mytable"""
dict = {'cols_1': 'id', 'cols_2': 'weather'}
qry = Template(qry).safe_substitute(dict)