Flask-SQLAlchemy当日股票数据查询失败,类型不匹配报错如何解决?
解决SQLAlchemy中日期匹配的类型错误问题
我一眼就看出问题出在你使用filter_by的方式上——这个方法是用来做简单的键值匹配的,你把一个比较表达式塞进去,肯定会出类型不匹配的错误!
错误原因分析
你写的filter_by(ticker=ticker, time_stamp=db.func.date(Stock.time_stamp) == date.today())里,time_stamp=后面跟着的是一个布尔表达式(db.func.date(...) == date.today()),SQLAlchemy会把这个表达式当作一个值,试图让time_stamp字段和这个布尔值做相等比较,这就导致了数据库抛出"没有匹配的操作符"的错误——datetime类型和布尔类型根本没法直接比较嘛!
db.func.date()确实做了类型转换,但你把它用错了地方,filter_by不支持这种表达式式的条件,得用filter()方法才行。
修正后的代码
把日期比较的条件放到filter()里,就可以正常运行了,两种写法都可以:
写法一:全部用filter()
@socketio.on("get initial data") def on_initial_data(ticker): """ 发送指定股票代码的初始股票数据。 :param str ticker: 待查询的股票代码。 """ today_stock_data = Stock.query.filter( Stock.ticker == ticker, db.func.date(Stock.time_stamp) == date.today() ).order_by(Stock.time_stamp).all() socketio.emit("initial data", [i.serialize for i in today_stock_data], room=request.sid)
写法二:filter_by + filter()结合
如果习惯用filter_by处理简单的键值匹配,可以把ticker的条件放在filter_by里,日期条件单独用filter():
@socketio.on("get initial data") def on_initial_data(ticker): """ 发送指定股票代码的初始股票数据。 :param str ticker: 待查询的股票代码。 """ today_stock_data = Stock.query.filter_by(ticker=ticker).filter( db.func.date(Stock.time_stamp) == date.today() ).order_by(Stock.time_stamp).all() socketio.emit("initial data", [i.serialize for i in today_stock_data], room=request.sid)
额外说明
如果你用的是PostgreSQL,也可以用类型转换的方式来写日期匹配,效果是一样的:
from sqlalchemy import Date # ... db.cast(Stock.time_stamp, Date) == date.today()
核心还是要把比较表达式放在filter()里,而不是filter_by的关键字参数中。
内容的提问来源于stack exchange,提问作者user5948213
相关产品推荐
相关产品推荐

