2016-05-04 193 views
0

我知道这个主题的变体已经在其他地方讨论过了,但其他线程都没有帮助。用Python中的字符串中的单个反斜杠替换双反斜线

我想交出一个字符串从Python到SQL。然而,可能会发生撇号(')出现在字符串中。我想用反斜杠来逃避它们。

sql = "update tf_data set authors=\'"+(', '.join(authors).replace("\'","\\\'"))+"\' where tf_data_id="+str(tf_data_id)+";" 

但是,这总是会给我的字符串\\'。因此,反斜杠本身被转义并且sql语句不起作用。

有人可以帮我或给我一个替代方式,我这样做吗? 谢谢

+0

提供你想要的原始字符串被发送到SQL –

+0

你用事先准备好的声明认为? – mba12

+1

你可以使用占位符,根本不需要任何转义。作为一个奖励,你不会打开自己的SQL注入,如果和当逃跑忽视的东西。 –

回答

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}) 
+0

谢谢,这与我所需要的非常接近。我只收到以下错误消息:ValueError:不支持的格式字符';' (0x3b)在索引66 – MaxS

+0

@MaxS你错误输入了字符串中的最后一个's'吗?也可以完全删除';',因为它不是必需的。 – Duncan

+0

@MaxS是的,应该没有';'到底。我会从我的答案中删除它。 – DeepSpace

0

正如其他人所暗示的,如果您使用python包来执行您的SQL,请使用提供的带参数占位符(如果可用)的方法。

我的答案解决了上述转义问题。 使用一个字符串文字前缀[R

print(r"""the\quick\fox\\\jumped\'""") 

输出:

the\quick\fox\\\jumped\' 
+0

如果我打印我的字符串,它会给我我想要的东西。但是,我将它添加到另一个字符串并将其交给SQL。在这种情况下打印不起作用 – MaxS

+0

print r“”“\ quick \ fox \\\ jumped \'”“”+ r“”“\ addition \\\”“”“OUTPUTS:\ quick \ fox \\ \ jumped \'\ addition \\\“ –

+0

另外你从来没有说过”把它交给sql“的部分是什么。你使用的是一个mysql包吗?直接在命令行上执行?您的确切输入和预期输出在您的问题中没有明确说明,因此任何人都难以回答您的问题。 –

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." 
+0

与打印的问题是,sql语句不会被打印,因此sql会看到双反斜杠以及 – MaxS

+0

不,它不会。该字符串不包含两个反斜杠。 ''\\''是一个只有一个反斜杠的字符串。 – Matthias

+0

你有没有尝试之前说什么SQL将做什么? :)(哦,Matthias更快) – Ilja

相关问题