postgresql SQLAlchemy与原始SQL一起使用时是否有效?

rt4zxlrg  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(135)

我有一个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交互的速度能快多少?(我对涉及额外第三方服务的答案不感兴趣。

pjngdqdw

pjngdqdw1#

我认为在这种情况下,你最好像这样使用func.countdb.session.query(func.count(OrmClass.id)).filter(OrmClass.column==condition).scalar()
.query()接口有很多怪癖,因为它主要是向后兼容的。我甚至不知道它会生成一个子查询来执行计数。我相信一定有原因的。
如果你正在使用1.4和future=True或者使用2+,那么你可以开始使用select(),我发现它对所有东西都更一致。
你可以用select()func.count()这样写,这更接近实际的SQL

from sqlalchemy.sql import select, func

count = db.session.execute(select(func.count(OrmClass.id)).where(OrmClass.column==condition)).scalar()

相关问题