我正在使用Python中的psycopg2向Postgres字符字段传递一些值。其中一些字符串值包含句点、斜杠、引号等。
对于MySQL,我只需使用转义字符串就可以:
MySQLdb.escape_string(my_string)
psycopg2 有没有相应的替代品?
我正在使用Python中的psycopg2向Postgres字符字段传递一些值。其中一些字符串值包含句点、斜杠、引号等。
对于MySQL,我只需使用转义字符串就可以:
MySQLdb.escape_string(my_string)
psycopg2 有没有相应的替代品?
转义是自动的,你只需要调用:
cursor.execute("query with params %s %s", ("param1", "pa'ram2"))
(请注意Python的%运算符没有使用),因此值将被正确转义。
您可以使用extensions.adapt(var)
手动转义变量,但这样做容易出错,并且无法考虑连接编码:它不应该在常规客户端代码中使用。
如果查询参数不足以满足需求,需要自行转义字符串,您可以使用Postgres转义字符串常量并结合Python的repr
(因为Python转义非ASCII和Unicode字符的规则与Postgres相同):
def postgres_escape_string(s):
if not isinstance(s, basestring):
raise TypeError("%r must be a str or unicode" %(s, ))
escaped = repr(s)
if isinstance(s, unicode):
assert escaped[:1] == 'u'
escaped = escaped[1:]
if escaped[:1] == '"':
escaped = escaped.replace("'", "\\'")
elif escaped[:1] != "'":
raise AssertionError("unexpected repr: %s", escaped)
return "E'%s'" %(escaped[1:-1], )
psycopg2
似乎在 2.7 版本中添加了一个方法:
http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.quote_ident
from psycopg2.extensions import quote_ident
with psycopg2.connect(<db config>) as conn:
with conn.cursor() as curs:
ident = quote_ident('foo', curs)
TypeError: argument 2 must be a connection or a cursor
,请尝试以下两种方法之一:ident = quote_ident('foo', curs.cursor)
# or
ident = quote_ident('food', curs.__wrapper__)
Psycopg2没有这样的方法。 它有一个 扩展,用于将Python值适应为ISQLQuote对象,并且这些对象具有getquoted()
方法以返回与PostgreSQL兼容的值。
请参阅此博客以获取如何使用它的示例:
更新2019-03-03:更改链接到archive.org,因为经过九年,原始链接已不再可用。
mogrify()
方法实现(http://initd.org/psycopg/docs/cursor.html#cursor.mogrify)。 - piro
adapt()
类似,你可以显式地使用特定的适配协议对象; 例如QuotedString(r"O'Reilly").getquoted()
参见文档。 - rakslicepsycopg2.sql.SQL()
的调用中使用psycopg2.sql.Identifier
来正确传递表名。 - dr_dronych