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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:50:32