使用python处理查询字符串中的撇号

时间:2018-10-09 04:31:24

标签: python sql string python-3.x amazon-redshift

我正在尝试使用Python查询Redshift。 我正在生成一个查询字符串,如下所示: 我使用psycopg2作为建立连接的库。

Select lat, lon, gender from table_x where x_name = "namestring"

如果我的姓名字符串包含',则查询字符串将无法执行。

有人可以告诉我避免这种错误的方法吗?我大约有2万5千个名字,因此不能用\'来转义它们。

2 个答案:

答案 0 :(得分:1)

使用http://initd.org/psycopg/docs/sql.html

中强烈建议的参数化查询
# somethin along the lines of this should work:

from psycopg2 import sql

names = [ "A", "McDiff", "Old'McDonal"]

for n in names:
    cur.execute(sql.SQL("Select lat, lon, gender from {} where x_name = %s")
                .format(sql.Identifier('table_x')),[n])

这避免了由于使用参数化查询构造而不是字符串连接而导致自引用的问题。


请参见Little Bobby Tables / Exploit of a Mom和Google sql注入的其他原因,以免使用字符串连接。

答案 1 :(得分:0)

您可以在字符串中使用单引号,并使用参数化的字符串替换您的值。

QUERY = """select lat, lon, gender from table_x where x_name = '{namestring}'"""
for namestring in list_of_namestrings:
    cur.execute(QUERY.format(namestring=namestring) 

这应该可以解决您的目的,您可以根据需要使QUERY复杂,并使用.format()

进行所需的替换