在分析应用程序时,我发现SQLAlchemy编译SQL是占用应用程序大部分CPU时间的任务之一。我已经明确地创建了绑定参数,但似乎SQLAlchemy只在执行它时才编译查询。
有没有办法让它预先编译查询,以便在执行之前只需要很少的工作来替换绑定的参数?
答案 0 :(得分:0)
有一种方式......有点儿。我已经在模块解析时定义了查询:
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_query时(每次调用它时)都只编译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尝试理解'distance'
内order_by()
并将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)