【问题标题】:SqlAlchemy performance: forbid querying e.g. in template generation?SqlAlchemy 性能:禁止查询,例如在模板生成中?
【发布时间】:2013-02-20 13:14:09
【问题描述】:

当数据库查找发生在我的项目中时,我发现 SqlAlchemy 的很多性能问题模板生成阶段。

是否可以告诉 SqlAlchemy“数据收集”已经完成,并且对会话的任何进一步查询(例如,作为访问检测属性的副作用)都会​​引发异常?

人们还使用了哪些其他策略来确保 ORM 运行良好?

【问题讨论】:

    标签: performance orm sqlalchemy


    【解决方案1】:

    无论您是在模板生成期间还是在此之前进行数据库查找,性能都没有差异 - 关键是要避免使用数百个查询对数据库造成冲击,无论这些查询源自何处。

    您需要跟踪在每个请求/响应周期中发出的查询数量 - 如果您看到许多查询,您就知道您需要优化访问数据的方式。

    许多 Web 框架都包含“调试工具栏”功能,例如 Pyramid 和 Flask 就有一个。如果您使用其中一个框架,只需启用它即可。

    否则,你自己滚动并不难:

    class QueryStats(object):
        def __init__(self):
            self.begin()
    
        def add_query(self, statement, parameters):
            self.queries += [(statement, parameters)]
    
        def begin(self):
            self.queries = []
    
    
    def before_cursor_execute(conn, cursor, statement, parameters, context
        DBSession.stats.add_query(str(statement), str(parameters))
    
    
    class SessionStatsBase(SessionBase):
        def __init__(self, *args, **kw):
            SessionBase.__init__(self, *args, **kw)
            self.stats = QueryStats()
    
    DBSession = scoped_session(sessionmaker(class_=SessionStatsBase, ...)
    event.listen(engine, "before_cursor_execute", before_cursor_execute)
    

    然后,您只需在页面底部打印一长串查询,或者,如果您愿意,如果请求发出的查询超过 100 个,则引发异常。

    【讨论】:

    • 很好的答案,将尝试编写一个根据您的代码引发异常的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2015-01-18
    • 2014-10-31
    • 2022-06-24
    • 2022-11-04
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多