【发布时间】:2013-02-20 13:14:09
【问题描述】:
当数据库查找发生在我的项目中时,我发现 SqlAlchemy 的很多性能问题模板生成阶段。
是否可以告诉 SqlAlchemy“数据收集”已经完成,并且对会话的任何进一步查询(例如,作为访问检测属性的副作用)都会引发异常?
人们还使用了哪些其他策略来确保 ORM 运行良好?
【问题讨论】:
标签: performance orm sqlalchemy
当数据库查找发生在我的项目中时,我发现 SqlAlchemy 的很多性能问题模板生成阶段。
是否可以告诉 SqlAlchemy“数据收集”已经完成,并且对会话的任何进一步查询(例如,作为访问检测属性的副作用)都会引发异常?
人们还使用了哪些其他策略来确保 ORM 运行良好?
【问题讨论】:
标签: performance orm sqlalchemy
无论您是在模板生成期间还是在此之前进行数据库查找,性能都没有差异 - 关键是要避免使用数百个查询对数据库造成冲击,无论这些查询源自何处。
您需要跟踪在每个请求/响应周期中发出的查询数量 - 如果您看到许多查询,您就知道您需要优化访问数据的方式。
许多 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 个,则引发异常。
【讨论】: