mariadb 如何在python中处理可以同时包含“和”的sql查询的字符串变量?

px9o7tmv  于 2023-03-18  发布在  Python
关注(0)|答案(2)|浏览(132)

我构造了一个sql查询

query_ = f'NSERT INTO {entity} (id, link, name, country_id) SELECT  {key}, "{value}", "{row[0]}", id FROM countries WHERE name = "{row[1]}";'

row = []是包含两个字符串的列表的列表
在某个时刻,我得到行[0] = '某个单词' somename ''
我的变量变成了

query_ = f'NSERT INTO wineries (id, link, name, country_id) SELECT  30052, "someword-somename", "Someword "somename"", id FROM countries WHERE name = "France";'

i得到错误mariadb.ProgrammingError: You have an error in your SQL syntax;
我高兴地将查询公式更改为:

query_ = f"INSERT INTO {entity} (id, link, name, country_id) SELECT  {key}, '{value}', '{row[0]}', id FROM countries WHERE name = '{row[1]}';"

下一次得到row[0] = Château La Chouette d'Or,我再次得到错误
第一个想法是这样的:

try:
    query_ = f"bla-bla-bla"
    myfunction(query_)
except:
   query_ = f'bla-bla-bla'
   myfunction(query_)
  • 但也许有一个标准的,更漂亮的解决方案来处理这样的字符串,我发明了一个轮子?*
prdp8dxp

prdp8dxp1#

为了避免可能的SQL注入以及需要转义的特殊字符的替换问题,方法是在执行语句时替换参数:

# Only numbers and literals can be substituted in execute(), 
# so we need to substitute table name before:
query_ = f'INSERT INTO {entity} (id, link, name, country_id) SELECT  ?, ?, ?, id FROM countries WHERE name = ?'

parameters= (key, value, row[0], row[1])
try:
    cursor.execute(query_, parameters)
except ...: 
    ....
eanckbw9

eanckbw92#

如果使用Python3+,请使用**""“**。

示例:-

"""your string with " and ' both"""

str_var = f"""random text {2+2} with 'test' and "dummy" as well"""

通过用“"”将字符串括起来,可以在字符串中使用任何字符(符号)。

相关问题