一尘不染

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

sql

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

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”

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


阅读 309

收藏
2021-03-10

共1个答案

一尘不染

在尝试使用的第二个参数时,无法参数化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)))

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

"SELECT %s AS NewColumn..."

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

"...HAVING Max(NumColumn) >= %s"
2021-03-10