我有一个Flask Web应用程序,它有一个Postgres数据库(<1000万行)。我使用SQLAlchemy与Postgres连接,但是我用原生SQLAlchemy编写的查询被编译成SQL太慢了。.count() method是这里的主要罪犯之一。我打算重写我的查询。伪代码示例:
从db.session.query(Table).filter(Table.column==condition).count()
至db.session.execute(sqlalchemy.text("SELECT count(Table.id) from Table WHERE Table.column=condition")
我的问题是:我能做得比execute-text结构更好吗?这仍然会被 Package 在缓慢的SQLAlchemy逻辑中吗?或者这是运行原始SQL的最佳方式?我调整Flask-Postgres交互的速度能快多少?(我对涉及额外第三方服务的答案不感兴趣。
1条答案
按热度按时间pjngdqdw1#
我认为在这种情况下,你最好像这样使用
func.count
:db.session.query(func.count(OrmClass.id)).filter(OrmClass.column==condition).scalar()
。.query()
接口有很多怪癖,因为它主要是向后兼容的。我甚至不知道它会生成一个子查询来执行计数。我相信一定有原因的。如果你正在使用1.4和
future=True
或者使用2+,那么你可以开始使用select()
,我发现它对所有东西都更一致。你可以用
select()
和func.count()
这样写,这更接近实际的SQL
: