为何使用psycopg2执行DELETE语句会出现编程错误?
解决PostgreSQL中DELETE语句的语法错误问题
这个问题我熟!你踩了psycopg2中SQL拼接的一个常见坑——用了Python原生字符串的format()来处理sql.Identifier对象,导致生成了PostgreSQL根本不认的语法。
错误原因分析
你写的代码:
db_cursor.execute(sql.SQL("DELETE FROM {}".format(sql.Identifier(table_name))))
本质是先把sql.Identifier(table_name)转成了字符串形式(也就是你报错里看到的Identifier('fixture_identification')),再拼进SQL语句里。PostgreSQL只认识带双引号或不带引号的合法表名,自然会报语法错误。
正确的写法
psycopg2的sql.SQL对象自带了专门的format()方法,就是用来安全拼接SQL标识符的,你得用这个替代Python字符串的format:
from psycopg2 import sql # 正确执行DELETE的写法 db_cursor.execute(sql.SQL("DELETE FROM {}").format(sql.Identifier(table_name)))
这样sql.Identifier会被正确转换成符合PostgreSQL语法的标识符(比如表名包含特殊字符或大写时,会自动加上双引号),同时还能避免SQL注入风险,一举两得。
扩展:带WHERE条件的DELETE语句
如果你的DELETE需要过滤条件,记得用%s作为参数占位符,把参数放在execute的第二个参数里,别再用字符串拼接:
# 带条件的DELETE示例 delete_stmt = sql.SQL("DELETE FROM {} WHERE status = %s").format(sql.Identifier(table_name)) db_cursor.execute(delete_stmt, ('expired',))
内容的提问来源于stack exchange,提问作者Markus Grunwald
相关产品推荐
相关产品推荐

