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

xghobddn  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(4)|浏览(234)

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

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语句中的单引号处给出了一个语法错误。

tp5buhyn

tp5buhyn1#

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

https://www.psycopg.org/docs/extensions.html#psycopg2.extensions.AsIs
顺便说一句,这不是一个数据库名称,它是一个表名。

3lxsmp7m

3lxsmp7m2#

SQL查询的结构组件(如表名和字段名)无法在cursor.execute(query, params)的第二个参数中进行参数化。只能参数化数字/文字数据值。
考虑将 database_name 变量插值到SQL查询字符串中,但使用psycopg 2的sqlIdentifier()str.format安全地执行此操作:

from psycopg2 import sql
...

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

在您的情况下,有效的parameterizaiton将绑定在附加查询(如VALUES(%s, %s, %s))中的VALUES(...)中传递的数据值。或者在其他查询中:

"SELECT %s AS NewColumn..."

"...WHERE fieldname = %s OR otherfield IN (%s, %s, %s)"

"...HAVING Max(NumColumn) >= %s"
plupiseo

plupiseo3#

  • 注意:我没有使用过psycopg2,这是基于我从类似数据库中了解到的。*

表名是一个标识符,它们的引号和转义方式与值不同。我相信你应该使用psycopg2.extensions.quote_ident(str, scope)来引用和转义它。我相信它使用了PostgreSQL函数PQescapeIdentifier()
PQescapeIdentifier对用作SQL标识符的字符串进行转义,例如表、列或函数名。当用户提供的标识符可能包含SQL解析器不会将其解释为标识符的一部分的特殊字符时,或者当标识符可能包含应保留大小写的大写字符时,这很有用。
然后它将被引用和转义,并且可以使用正常的字符串操作安全地添加到SQL字符串中,而不会冒SQL injection attack的风险,或者使用AsIs(quote_ident(database_name))作为.execute的值。

xggvc2p6

xggvc2p64#

事实上,database_name"'foo'"
删除单引号:

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

相关问题