Python 在数据库查询字符串中转义引号的好方法?

Python 在数据库查询字符串中转义引号的好方法?,python,database,escaping,sql-injection,Python,Database,Escaping,Sql Injection,我尝试过各种Python模块,它们要么逃逸太多,要么逃逸方式不对。 在Python中,对引号(“,”)进行转义的最佳方法是什么?如果它是数据库查询的一部分,您应该能够使用 除了转义引号外,这将处理所有特殊字符,并保护您免受攻击。为了解决更一般的问题,我有一个程序,需要将任何字符集存储在以制表符分隔的平面文件中。显然,制表符位于“集合”中会导致问题 我用output_f.write(repr(str))代替output_f.write(str),这解决了我的问题。 它的读取速度较慢,因为我需要在读

我尝试过各种Python模块,它们要么逃逸太多,要么逃逸方式不对。
在Python中,对引号(“,”)进行转义的最佳方法是什么?

如果它是数据库查询的一部分,您应该能够使用


除了转义引号外,这将处理所有特殊字符,并保护您免受攻击。

为了解决更一般的问题,我有一个程序,需要将任何字符集存储在以制表符分隔的平面文件中。显然,制表符位于“集合”中会导致问题

我用output_f.write(repr(str))代替output_f.write(str),这解决了我的问题。
它的读取速度较慢,因为我需要在读取时对输入求值(),但总的来说,它使代码更干净,因为我不再需要检查边缘情况。

如果您使用的是具有转义字符串方法的psycopg2:
psycopg2.extensions.adapt()
有关完整答案,请参见

三重双引号最适合转义:

string = """This will span across 'single quotes', "double quotes", and literal EOLs all in the same string."""
cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))
字符串=“这将跨越‘单引号’、‘双引号’,
“将字符串转义并将其他对象转换为编程形式的简单标准方法是使用内置的
repr()
函数。它将对象转换为您需要使用手动代码输入的表示形式

例如:


没有奇怪的黑客攻击,它是内置的,并且只适用于大多数用途。

使用
json.dumps

>>> import json
>>> print json.dumps('a"bc')
"a\"bc"

如果使用psycopg2,则其
execute()
方法具有内置转义:

string = """This will span across 'single quotes', "double quotes", and literal EOLs all in the same string."""
cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))
请注意,您为执行方法提供了两个参数(字符串和元组),而不是使用Python的%运算符修改字符串


这里的答案:

三重单引号将方便地封装SQL查询中常用的单引号:

c.execute('''SELECT sval FROM sdat WHERE instime > NOW() - INTERVAL '1 days' ORDER BY instime ASC''')

在我的用例中,我在数据库中保存了一个段落,段落中的某个地方可能有一个带有单引号的文本
(例如:Charlie的苹果酱是湿漉漉的)

我发现这样做效果最好:

database_cursor.execute('''INSERT INTO books.collection (book_name, book_quoted_text) VALUES ('%s', "%s")''' % (book_name, page_text.strip()))

您会注意到我使用了
”“
将INSERT语句包装在

中后,您希望在什么上下文中进行转义?对于python字符串,还是到数据库中?这是Postgres数据库查询的一部分。+1:如果在数据库查询中转义引号,则SQL错误。很好,现在我只需要一个python 3.0的副本。为什么需要python 3.0来使用参数化SQL语句?它们存在于所有版本和所有Postgres Python接口中。我还需要在Python 3.0中使用其他功能。@S.Lott您能解释一下原因吗?您是否有一个比转义引号更好/更简洁的方法的链接?在这种情况下它不起作用:
string=“”这是一个包含引号“”的字符串“
repr/eval在这种情况下是个坏主意。您可以改用
csv
模块。它将为您在字段中嵌入选项卡这可能不是OP想要的。repr确实会转义引号,但它也会将字符串用单引号括起来。例如:repr(“国王的城堡”)变成了“国王的城堡”(注意包装引号)。我最后得到了
u'I'm happy I'm“here”now'
repr
使用Python规则进行转义,并带有反斜杠。我的印象是OP想要返回一个具有不同规则的SQL文本-单引号应该加倍,反斜杠不重要。当字符串中包含Unicode字符时,这会失败:
print json.dumps(u“)
prints
“\u00a3”
,除了上面的问题之外,这工作得很好,但对于一个可以更简单地解决的问题来说,这是一个非常沉重的解决方案。