Python 有没有办法让SQLAlchemy预编译查询?
在分析应用程序时,我发现SQLAlchemy编译SQL是占用应用程序大部分CPU时间的任务之一。我已经明确了绑定参数,但SQLAlchemy似乎只在执行查询时编译查询Python 有没有办法让SQLAlchemy预编译查询?,python,sqlalchemy,Python,Sqlalchemy,在分析应用程序时,我发现SQLAlchemy编译SQL是占用应用程序大部分CPU时间的任务之一。我已经明确了绑定参数,但SQLAlchemy似乎只在执行查询时编译查询 有没有一种方法可以让它预编译查询,这样在执行之前只需要很少的工作就可以替换绑定参数?有一种方法。。。有点在模块解析时,我已经定义了查询: class MyClass(object): # This works (slow) query = select(...).where(...).order_by('dista
有没有一种方法可以让它预编译查询,这样在执行之前只需要很少的工作就可以替换绑定参数?有一种方法。。。有点在模块解析时,我已经定义了查询:
class MyClass(object):
# This works (slow)
query = select(...).where(...).order_by('distance').limit(1)
...
@classmethod
def issue_query(cls, **params):
cls.engine.execute(cls.query, params)
但SQLAlchemy仅在调用MyClass.issue\u查询时(每次调用时)才编译MyClass.query。我注意到,将查询定义为text()
使其速度非常快(120us vs 600us)。。。但是str(query)
将查询编译成一个text()
参数,因此我尝试将其定义为:
class MyClass(object):
# This doesn't work
query = text(str(select(...).where(...).order_by('distance').limit(1)))
...
@classmethod
def issue_query(cls, **params):
cls.engine.execute(cls.query, params)
但是SQLAlchemy试图理解order_by()
内部的'distance'
,并将1
内部的limit()
转换为绑定参数(即从查询中删除该值)。这可以通过一些小技巧来解决:
class MyClass(object):
# This works (fast)
query = text(str(select(...).where(...).order_by(text('distance')).limit(text('1'))))
...
@classmethod
def issue_query(cls, **params):
cls.engine.execute(cls.query, params)
你使用什么数据库?这可能会帮助你:Simeon:PostgreSQL;伊恩:谢谢你在用ORM吗?如果是这样的话,如果问题是您有很多重复查询,那么SQLAlchemy 1.0有一个新功能,名为,在这里可能很有用/感兴趣。刚刚发现您不能以这种方式使用任何绑定参数。甚至不用bindparam()。