&引用;Psycopg2.error列不存在';“不存在”;尝试在Python上编写注入安全的PostgreSQL查询时出错

&引用;Psycopg2.error列不存在';“不存在”;尝试在Python上编写注入安全的PostgreSQL查询时出错,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在编写一个函数,使用psycopg2库为PostgreSQL数据库动态创建插入/更新/选择查询 我一直在尝试根据-使用sql.sql方法正确组合查询所提供的建议编写函数注入安全。所有参数(表名、要插入的列、值)都动态传递给函数: def插入(表、列:列表、值:列表): query=sql.sql('插入到{}({})值({});').format( sql.Identifier(表), sql.sql(',).join(映射(sql.Identifier,列)), sql.sql(',').

我正在编写一个函数,使用psycopg2库为PostgreSQL数据库动态创建插入/更新/选择查询

我一直在尝试根据-使用
sql.sql
方法正确组合查询所提供的建议编写函数注入安全。所有参数(表名、要插入的列、值)都动态传递给函数:

def插入(表、列:列表、值:列表):
query=sql.sql('插入到{}({})值({});').format(
sql.Identifier(表),
sql.sql(',).join(映射(sql.Identifier,列)),
sql.sql(',').join(映射(sql.Identifier,values))
)
cursor=foo_connection.cursor()
cursor.execute(查询)
当我尝试测试功能时:

insert('test_table',['col1','col2','col3'],['1','2','3']))
我得到以下错误:

psycopg2.errors.UndefinedColumn: column "1" does not exist
LINE 1: ...e" ("col1", "col2", "col3") VALUES ("1", "2", ...
我不理解这个错误,因为从技术上讲,它甚至不是一个列,而是一个要插入的值

我认为查询的组成不正确,但打印(query.as\u string(foo\u connection))的结果表明它似乎是正确的:

INSERT INTO "test_table" ("col1", "col2", "col3") VALUES ("1", "2", "3");
官方文件没有涵盖这种情况。谷歌也没有给我答案

因此,问题是:

  • 我做错了什么
  • 如何使此代码工作

  • 我想这是你对你的问题的引用。也许可以尝试在外面使用双打:

    def insert(table, columns: list, values: list):
    
        query = sql.SQL("INSERT INTO {} ({}) VALUES ({});").format(
                        sql.Identifier(table),
                        sql.SQL(', ').join(map(sql.Identifier, columns)),
                        sql.SQL(', ').join(map(sql.Literlas, values))
                       )
        cursor = foo_connection.cursor()
        cursor.execute(query)
    

    问题是您将值常量格式化为
    sql.Identifier

    这导致它们被双引号而不是单引号引用,因此PostgreSQL将它们视为表列。因此出现了错误消息


    最好是为文本使用
    %s
    占位符,并将它们作为第二个参数传递给
    execute()

    ,正如Laurenz所说,在psycopg2文档中,它是这样写的:

    标识符通常表示数据库对象的名称,例如表或字段

    我还看到了文字对象:

    表示要包含在查询中的SQL值

    在格式化查询时,您可以尝试用文字替换标识符:

    query = sql.SQL('INSERT INTO {} ({}) VALUES ({});').format(
                    sql.Identifier(table),
                    sql.SQL(', ').join(map(sql.Identifier, columns)),
                    sql.SQL(', ').join(map(sql.Literals, values))
                   )
    

    您能检查postgres数据库表列吗
    UndefinedColumn:列“1”不存在
    似乎表明您正在尝试向名为“1”的列中插入值,该列不是表中的实际列。错误表明我正在尝试插入名为“1”的列但是它是根据问题中提到的查询打印插入的值。有没有办法使
    sql.Identifier
    创建单引号?或者我应该以完全不同的方式组合查询?使用参数,如扩展答案中所示。这样做了!谢谢你的帮助,先生!