&引用;Psycopg2.error列不存在';“不存在”;尝试在Python上编写注入安全的PostgreSQL查询时出错
我正在编写一个函数,使用psycopg2库为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(',').
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
创建单引号?或者我应该以完全不同的方式组合查询?使用参数,如扩展答案中所示。这样做了!谢谢你的帮助,先生!