我知道这个主题的变体已在别处讨论过,但其他任何一个主题都没有用。
我想将一个字符串从python移交给sql。然而,可能会发生撇号(')出现在字符串中。我想用反斜杠逃避它们。
sql = "update tf_data set authors=\'"+(', '.join(authors).replace("\'","\\\'"))+"\' where tf_data_id="+str(tf_data_id)+";"
但是,这将始终在我的字符串中提供\\'
。因此,反斜杠本身被转义,并且sql语句不起作用。
有人可以帮助我,或者让我替代我这样做的方式吗? 感谢
答案 0 :(得分:6)
根本不这样做。
也不要连接sql查询,因为它们容易进行sql注入。
而是使用参数化查询:
sql = "update tf_data set authors=%(authors)s where tf_data_id=%(data_id)s"
# or :authors and :data_id, I get confused with all those sql dialects out there
authors = ', '.join(authors)
data_id = str(tf_data_id)
# db or whatever your db instance is called
db.execute(sql, {'authors': authors, 'data_id': data_id})
答案 1 :(得分:2)
您正在使用双引号字符串,但仍会转义其中的单引号。这不是必需的,您需要做的就是转义要在替换操作中使用的反斜杠。
>>> my_string = "'Hello there,' I said."
>>> print(my_string)
'Hello there,' I said.
>>> print(my_string.replace("'", "\\'"))
\'Hello there,\' I said.
请注意,我正在使用打印。如果你只是要求Python在替换操作后向你显示字符串的表示,你会看到双反斜杠,因为它们需要被转义。
>>> my_string.replace("'", "\\'")
"\\'Hello there,\\' I said."
答案 2 :(得分:0)
正如其他人所提到的,如果您使用python包来执行SQL,请使用提供的方法和参数占位符(如果可用)。
我的回答解决了提到的逃避问题。 使用前缀为r
的字符串文字print(r"""the\quick\fox\\\jumped\'""")
输出:
the\quick\fox\\\jumped\'