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

psycopg2执行含now()::date的SELECT语句报错求助

解决方案:psycopg2中now()::date参数化报错问题

错误根源在于你把now()::date作为字符串参数传给了参数化查询的占位符%s,psycopg2会将其当作普通字符串处理,而PostgreSQL无法把字符串"now()::date"解析成合法的timestamp类型,所以抛出语法错误。

以下是三种可行的解决办法:

方案1:将SQL表达式直接写入查询语句

now()::date是PostgreSQL的内置函数转换逻辑,不需要作为参数传递,直接写在SQL语句中即可:

query = f"SELECT * FROM {table} WHERE (createdat >= now()::date AND type=%s)"
cur.execute(query, ("t_order",))
records = cur.fetchall()

方案2:用psycopg2安全构造动态表名(推荐,防SQL注入)

如果table变量是动态传入的,直接用f-string拼接存在SQL注入风险,建议使用psycopg2的sql模块构造查询:

from psycopg2 import sql

query = sql.SQL("SELECT * FROM {} WHERE (createdat >= now()::date AND type=%s)").format(sql.Identifier(table))
cur.execute(query, ("t_order",))
records = cur.fetchall()

方案3:传递Python日期对象替代SQL表达式

用Python的date.today()获取当前日期,psycopg2会自动将其转换为PostgreSQL兼容的date类型:

from datetime import date

today = date.today()
query = f"SELECT * FROM {table} WHERE (createdat >= %s AND type=%s)"
cur.execute(query, (today, "t_order"))
records = cur.fetchall()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:40:42