如何从Python中删除SQL查询字符串中的引号?

时间:2017-05-09 18:21:18

标签: python sql postgresql psycopg2

我有一个数据库名称字典。我从字典中取名字

database_name = database_dict[i]

假设database_name的值为'foo'

使用Psycopg2我正在执行一个声明:

cur.execute("INSERT INTO %s VALUES(...);", database_name)

我在foo上遇到语法错误,因为它应该是“INSERT INTO foo VALUES”而不是“INSERT INTO'foo'VALUES”

有关如何传递表名称的字符串值并删除单引号的任何建议吗?我应该在数据库字典值中放置转义字符吗?

编辑:离此更近了:How do I remove single quotes from a table in postgresql?

但我无法使用REMOVE工作。它在remove语句中的单引号中给出了语法错误。

4 个答案:

答案 0 :(得分:4)

cursor.execute(query, params)的第二个参数中尝试时,无法参数化SQL查询的结构组件(如表和字段名称)。只能参数化数字/文字数据值。

考虑将 database_name 变量插入到SQL查询字符串中,但使用psycopg2的sqlIdentifier() str.format安全地执行此操作:

from psycopg2 import sql
...

cur.execute(sql.SQL('INSERT INTO {} VALUES(...)').format(sql.Identifier(database_name)))

在您的情况下,有效parameterizaiton将绑定VALUES(...)中附加VALUES(%s, %s, %s)中传递的数据值,例如"SELECT %s AS NewColumn..." "...WHERE fieldname = %s OR otherfield IN (%s, %s, %s)" "...HAVING Max(NumColumn) >= %s" 。或者在其他查询中:

SwipeAdapter's

答案 1 :(得分:3)

from psycopg2.extensions import AsIs
cur.execute("INSERT INTO %s VALUES(...);", AsIs(database_name))

http://initd.org/psycopg/docs/extensions.html#psycopg2.extensions.AsIs

BTW不是数据库名称,而是表名。

答案 2 :(得分:0)

如果确实如此,database_name"'foo'"

删除单引号:

database_name = database_name.replace("'", "")

答案 3 :(得分:0)

注意:我没有使用psycopg2,这是基于我从类似数据库中所知的。

表名是标识符,它们的引用和转义与值不同。我相信你应该使用psycopg2.extensions.quote_ident(str, scope)引用并逃避它。我相信它使用PostgreSQL函数PQescapeIdentifier()

  

PQescapeIdentifier转义字符串以用作SQL标识符,例如表,列或函数名称。当用户提供的标识符可能包含特殊字符时,这非常有用,否则SQL解析器不会将其解释为标识符的一部分,或者标识符可能包含应保留其大小写的大写字符。

然后它将被引用和转义,并且可以使用正常的字符串操作安全地添加到SQL字符串,而不会冒SQL injection attack的风险,或者使用AsIs(quote_ident(database_name))作为.execute的值。< / p>