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

