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

FastAPI中使用SQLAlchemy根据主键MSISDN查询MySQL指定日期字段报错问题咨询

解决SQLAlchemy中Query.get()与现有筛选条件冲突的报错

咱们先理清楚问题出在哪:你用filter()添加了last_port的筛选条件后,又调用了get(portabilidad_msisdn),但get()方法是SQLAlchemy专门用来仅通过主键查询单条数据的,它会直接忽略之前添加的所有filter条件,而且SQLAlchemy不允许你把get()和其他筛选条件混用,这就是报错Query.get() being called on a Query with existing criterion的原因。

再看你的需求:要同时根据主键msisdn和日期last_port查询数据,那咱们得换个正确的写法,还要注意一个细节——你的模型里last_port是Date类型,但你传入的fecha_csv是带时间的字符串('2020-04-23 6:00:00'),Date类型只存储日期部分,时间会被忽略,所以查询前得先把字符串转成date对象,否则会出现类型不匹配查不到数据的情况。

修正后的代码示例

首先处理日期格式:

from datetime import datetime

portabilidad_msisdn = 56977095634  # 注意:模型里msisdn是Integer类型,别传字符串
fecha_csv = '2020-04-23 6:00:00'
# 将带时间的字符串转为date对象
date_obj = datetime.strptime(fecha_csv, '%Y-%m-%d %H:%M:%S').date()

然后用两种方式实现查询:

方式1:使用filter()(适合复杂条件)

date_info = session.query(PortabilidadInfo).filter(
    PortabilidadInfo.msisdn == portabilidad_msisdn,
    PortabilidadInfo.last_port == date_obj
).first()

方式2:使用filter_by()(适合简单的等于条件,语法更简洁)

date_info = session.query(PortabilidadInfo).filter_by(
    msisdn=portabilidad_msisdn,
    last_port=date_obj
).first()

补充说明

  • first()会返回第一条匹配的结果(因为msisdn是主键,所以最多只有一条),如果没有匹配数据会返回None;如果你确定查询结果必须存在,可以用one(),它在没有数据或多条数据时都会抛出异常。
  • 注意模型里msisdn是Integer类型,所以传入的portabilidad_msisdn应该是整数,不是字符串,避免类型不匹配。
  • 如果你的数据库中last_port实际存储的是带时间的datetime类型,那模型里要把Column(Date, ...)改成Column(DateTime, ...),同时查询时用datetime对象而不是date对象。

内容的提问来源于stack exchange,提问作者Matias Gonzalez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:19:03