首页 > 解决方案 > 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

标签: pythonpostgresqlpsycopg2

解决方案


您正在.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


推荐阅读