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
相关产品推荐
相关产品推荐

