SQLAlchemy count()返回NoneType导致FastAPI项目报错求助
兄弟,我之前用特殊数据库适配器的时候也碰到过类似的坑,结合你说的情况,我来帮你捋捋问题出在哪以及怎么解决:
首先,你这段代码本身就有个小误区:
query = db.query(query_class) total_items = query.count().scalar()
在SQLAlchemy 1.4里,Query.count()方法本身就会执行SELECT COUNT(*)查询并直接返回整数结果,根本不需要再链式调用.scalar()!你多加的这个.scalar()完全是画蛇添足,而且如果底层的sqlalchemy-databricks适配器对count语句的实现有兼容问题,就会导致这个多余的调用拿到None,进而触发你看到的类型错误。
那为什么len(db.query(query_class).all())能工作?因为all()是把所有数据都拉到本地内存变成列表,len()只是统计这个列表的长度——这是客户端侧的统计,绕开了数据库端count语句的兼容问题,但这种方式在数据量一大的时候性能会爆炸,绝对不能当长期方案用。
给你几个具体的修复方案,按优先级试:
最直接的修复:移除多余的
.scalar()
把代码改成这样就行:query = db.query(query_class) total_items = query.count()这是SQLAlchemy count统计的标准写法,只要适配器没有严重的bug,应该就能正常返回整数。
显式构造COUNT查询,兼容特殊适配器
如果上面的方法还是不行,试试用func.count显式构造统计语句,这种方式兼容性更强:from sqlalchemy import func total_items = db.query(func.count()).select_from(query_class).scalar()这种写法会直接生成标准的
SELECT COUNT(*) FROM your_table语句,能避开一些适配器对Query.count()方法的特殊实现问题。检查适配器版本
你用的sqlalchemy-databricks 0.2.0版本确实比较旧了,说不定这个count的兼容问题在后续更新里已经被修复了,你可以尝试升级到最新版本试试。
最后提醒下,以后碰到这种ORM方法和预期不符的情况,先去翻对应版本的ORM文档确认方法的返回值,很多时候都是因为误用了API导致的问题~
备注:内容来源于stack exchange,提问作者Robert Riley

