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

Python 有没有办法让SQLAlchemy预编译查询?,python,sqlalchemy,Python,Sqlalchemy,在分析应用程序时,我发现SQLAlchemy编译SQL是占用应用程序大部分CPU时间的任务之一。我已经明确了绑定参数,但SQLAlchemy似乎只在执行查询时编译查询 有没有一种方法可以让它预编译查询,这样在执行之前只需要很少的工作就可以替换绑定参数?有一种方法。。。有点在模块解析时,我已经定义了查询: class MyClass(object): # This works (slow) query = select(...).where(...).order_by('dista

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


有没有一种方法可以让它预编译查询,这样在执行之前只需要很少的工作就可以替换绑定参数?

有一种方法。。。有点在模块解析时,我已经定义了查询:

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()。