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

问题描述 投票:0回答:4

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

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

python sql postgresql psycopg2
4个回答
19
投票
from psycopg2.extensions import AsIs
cur.execute("INSERT INTO %s VALUES(...);", AsIs(database_name))

https://www.psycopg.org/docs/extensions.html#psycopg2.extensions.AsIs

顺便说一句,这不是数据库名称,而是表名称。


11
投票

SQL 查询的结构组件(例如表名和字段名)无法在您尝试使用

cursor.execute(query, params)
的第二个参数时进行参数化。只能参数化数字/文字数据值。

考虑将 database_name 变量插入 SQL 查询字符串,但使用 psycopg2 的

sqlIdentifier()
str.format
:

安全地这样做
from psycopg2 import sql
...

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

Valid parameterizaiton 在您的情况下,将绑定在

VALUES(...)
中传递的数据值在附加查询中,例如
VALUES(%s, %s, %s)
。或者在其他查询中:

"SELECT %s AS NewColumn..."

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

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

1
投票

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

表名是一个标识符,它们被引用和转义的方式与值不同。我相信你应该使用

psycopg2.extensions.quote_ident(str, scope)
来引用和转义它。我相信它使用 PostgreSQL 函数
PQescapeIdentifier()
.

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

然后它将被引用和转义,并且可以使用正常的字符串操作安全地添加到 SQL 字符串中,而不会冒 SQL 注入攻击 的风险,或者使用

AsIs(quote_ident(database_name))
作为
.execute
的值。


-2
投票

如果事实,

database_name
"'foo'"
.

要删除单引号:

database_name = database_name.replace("'", "")
© www.soinside.com 2019 - 2024. All rights reserved.