psycopg2插入含time/date字段表时提示current_time附近语法错误
问题原因
报错核心是current_time是PostgreSQL的内置保留关键字,作用是获取当前时间,你拼接SQL时直接将列名裸写,数据库解析时会将其识别为内置关键字而非自定义列名,因此抛出语法错误。其余表运行正常是因为列名均未命中数据库保留字。
你当前的列拼接逻辑直接用逗号拼接原始列名,既没有做标识符转义,也存在SQL注入风险。
修复方法
方法1:转义标识符(改动最小)
PostgreSQL规定,当标识符(表名、列名)为保留字、包含特殊字符或需要区分大小写时,必须用双引号包裹才能被正确识别。修改列拼接逻辑,给每个列名加上双引号转义即可:
columns = list(kwargs.keys()) values = [kwargs[column] for column in columns] # 转义列名,常规业务场景下列名不会包含双引号,直接包裹即可 escaped_cols = ','.join(f'"{col}"' for col in columns) insert_statement = f'insert into "{table}"({escaped_cols}) values %s' obj = cur.mogrify(insert_statement, (tuple(values),))
方法2:修改列名规避保留字(长期维护更友好)
如果业务规则允许,将current_time列修改为非保留字名称,例如forecast_time、create_tm等,从根源上避免关键字冲突,后续开发也不容易踩同类坑。
优化建议
你同时使用了SQLAlchemy的话,不建议手动拼接INSERT语句,直接用SQLAlchemy提供的insert语法构造语句即可,框架会自动完成保留字转义、类型适配,既不会出现语法错误,也能规避SQL注入风险:
from sqlalchemy import insert # 直接构造插入语句,自动适配所有字段转义 insert_stmt = insert(HourlyForecast).values(**kwargs) # 若需要获取原生可执行SQL,可直接编译对应方言的语句
内容的提问来源于stack exchange,提问作者Maksym Andreiev
相关产品推荐
相关产品推荐

