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

