python - psycopg2 动态插入查询问题,标识符处或附近的语法错误
问题描述
我正在编写一个程序来从另一个来源提取大量数据并将其记录在 Postgres 数据库中。我需要一个函数,它接收目标表和一个要添加变量字段的字典,然后根据需要插入它。看起来它应该很简单,但是我在生成插入查询时遇到了问题。我在网上找到的示例要么是部分的、过时的,要么在我为我的数据修改它们时根本不起作用。
这是我整理出来的一个简单版本。我已经尝试了很多这样的变体,所以它可能没有现在应该的那么干净。感觉就像我错过了一些非常简单的东西,但如果是这样,我只是没有看到它。
def insert_record():
table = "test"
record = {"name": "Jack", "id": 1}
fields = record.keys()
values = ", ".join(str(n) for n in record.values())
query = sql.SQL("INSERT INTO {} ({}) VALUES ({});".format(
sql.Identifier(table),
sql.SQL(",").join(map(sql.Identifier, fields)),
sql.SQL(",").join(sql.Placeholder() * len(fields))
))
cursor = connection.cursor()
print(query.as_string(connection))
try:
cursor.execute(query, (values,))
connection.commit()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
cursor.close()
这将返回错误:
syntax error at or near "'test'"
LINE 1: INSERT INTO Identifier('test') (Composed([Identifier('name')...
看起来它实际上并没有出于某种原因格式化查询,因为 as_string 函数也返回未格式化的:
"INSERT INTO Identifier('test') (Composed([Identifier('name'), SQL(','), Identifier('id')])) VALUES (Composed([Placeholder(''), SQL(','), Placeholder('')]));"
有关如何解决此问题的任何建议,或一般处理动态查询的更好方法?
编辑:这是我的导入声明
import psycopg2
from psycopg2 import extras, Error, sql
解决方案
您正在.format()
从对象字符串调用函数,您必须.format()
从sql.SQL()
对象类调用函数。
query = sql.SQL("INSERT INTO {} ({}) VALUES ({});").format(
sql.Identifier(table),
sql.SQL(",").join(map(sql.Identifier, fields)),
sql.SQL(",").join(sql.Placeholder() * len(fields))
)
参考:https ://www.psycopg.org/docs/sql.html?highlight=literal#module-usage
推荐阅读
- javascript - 当父元素具有 CSS 属性时,赛普拉斯如何断言元素可见:显示:无
- r - 双域潜在增长曲线的选项(可能在 lavaan 中?)
- python - 如何水平和垂直连接两个 alpha 图像?
- xml - 文本不会放在 textview 的中间
- codenameone - 我在css文件里加了一张jpg图片,怎么又去掉了?
- google-chrome-devtools - 离线时来自 Workbox 的 offlineFallback 不起作用
- c# - 有没有办法让某事花费一定的时间c#
- reactjs - 过滤表时排序图标改变方向的意外行为
- matlab - 嵌套 for 循环在所有情况下都太慢?
- python - 在我的电脑中选择文件的 Python 函数