有没有办法让SQLAlchemy预编译一个查询?

时间:2015-06-20 17:44:20

标签: python sqlalchemy

在分析应用程序时,我发现SQLAlchemy编译SQL是占用应用程序大部分CPU时间的任务之一。我已经明确地创建了绑定参数,但似乎SQLAlchemy只在执行它时才编译查询。

有没有办法让它预先编译查询,以便在执行之前只需要很少的工作来替换绑定的参数?

1 个答案:

答案 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()并将1limit()转换为绑定参数(即从查询中删除值) )。这可以通过一点点破解来解决:

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)