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

PostgreSQL报错psycopg2.errors.UndefinedColumn:列"2022-08-01"不存在——创建月初数据过滤查询的问题排查

问题分析与解决

嘿,这个问题我太熟悉了!咱们一步步拆解来看:

为啥会报“列不存在”?

你遇到的psycopg2.errors.UndefinedColumn: column "2022-08-01" does not exist错误,核心原因是你用双引号把日期值包起来直接拼进SQL了。

在PostgreSQL的语法规则里:

  • 单引号'是用来包裹字符串、日期这类实际数值的
  • 双引号"是用来标记表名、列名这类数据库对象名称的

你的代码里写了"{first_day_of_month}",这就相当于告诉PostgreSQL:“去查一个叫2022-08-01的列”,但你的expense表根本没这个列,自然就报错了。

正确的写法应该是怎样的?

千万别直接把变量硬拼到SQL里(这还会有SQL注入的风险!),psycopg2本身就支持安全的参数化查询,用它来传递参数就没问题了:

方式1:位置参数

cur.execute('SELECT SUM(money_amount) FROM expense WHERE created >= %s', (first_day_of_month,))

方式2:命名参数(可读性更好)

cur.execute(
    'SELECT SUM(money_amount) FROM expense WHERE created >= %(start_date)s',
    {'start_date': first_day_of_month}
)

psycopg2会自动帮你处理参数的类型转换和转义,既不会出现语法错误,还能避免恶意注入的风险。

可以先手动验证下SQL

你也可以在PostgreSQL的客户端里先跑一下正确的SQL语句确认效果:

SELECT SUM(money_amount) FROM expense WHERE created >= '2022-08-01';

这里用单引号包裹日期,PostgreSQL就能正确识别成DATE类型的数值,而不是列名啦。

内容的提问来源于stack exchange,提问作者etozhefifan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:38:14