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

FastAPI中PostgreSQL时间戳转YYYYMMDD查询报错,如何修改days变量?

问题解决方法

错误原因

报错TypeError: '<' not supported between instances of 'str' and 'int'是因为SQL语句占位符使用错误,同时查询中TO_CHAR(updated_at, 'YYYYMMDD')返回字符串类型,与参数传递的类型处理逻辑冲突导致的。

两种修正方案

方案1:保持字符串比较(推荐,无额外类型转换损耗)

days保留字符串格式,修正SQL占位符为PostgreSQL+SQLAlchemy支持的参数化写法,并用text()包裹SQL语句:

from datetime import datetime
from sqlalchemy import text

# days无需修改,保持YYYYMMDD格式的字符串
days = datetime.now().strftime("%Y%m%d")

# 使用%s作为统一占位符,用text()包裹SQL语句
ex = session.execute(text("""SELECT * FROM tb WHERE num = %s AND TO_CHAR(updated_at, 'YYYYMMDD') >= %s"""), (num, days))

方案2:转为整数类型比较

将days转为整数,同时在SQL中把TO_CHAR的结果也转为整数,以数字类型进行比较:

from datetime import datetime
from sqlalchemy import text

# 将days转换为整数
days = int(datetime.now().strftime("%Y%m%d"))

# 把TO_CHAR的结果转为整数后再比较
ex = session.execute(text("""SELECT * FROM tb WHERE num = %s AND CAST(TO_CHAR(updated_at, 'YYYYMMDD') AS INTEGER) >= %s"""), (num, days))

关键说明

原代码中使用%d作为num的占位符是错误的——这是Python字符串格式化语法,而非SQL参数化查询的占位符。SQLAlchemy+PostgreSQL需使用%s作为统一占位符(或命名参数),配合text()函数处理原生SQL语句,避免类型冲突和SQL注入风险。

内容的提问来源于stack exchange,提问作者Tae In Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:17:32