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

