You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:54:20