如何监控/记录sqlalchemy作用域会话?

时间:2013-05-14 08:41:14

标签: python sqlalchemy

我正在研究一个使用SqlAlchemy的遗留应用程序,其架构是......好......不是最理想的。

我最近发现应用程序打开了很多(不需要的)mysql连接,我想确定执行该操作的代码。我想它们是scoped_sessions打开的结果。

我可以手动搜索它们,但我想知道是否有可能将代码用于发现有问题的功能/模块。 (SQLAlchemy监视器很有用,但我认为不存在)。

1 个答案:

答案 0 :(得分:1)

SessionExtension对于检查

非常有用

例如:

import traceback
from collections import defaultdict
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.orm.interfaces import SessionExtension


# TODO cleanup commited sessions
class MySessionUsageInspector(SessionExtension):

    def __init__(self):
        self.connections = defaultdict(list)

    def after_begin(self, session, transaction, connection):
        self.connections[connection].append(traceback.format_stack()[0])

    def repr_usage(self):
        for cnn, callers in self.connections.items():
            print(cnn)
            for index, caller in enumerate(callers):
                print('\t', index, caller)


if __name__ == '__main__':
    engine = create_engine('sqlite://')
    session_inspector = MySessionUsageInspector()
    Session = scoped_session(sessionmaker(bind=engine, 
        extension=session_inspector)
    )
    session = Session()

    session.execute('select 1;')
    session.commit()
    session.execute('select 2;')

    print('Session usage:')
    session_inspector.repr_usage()

抱歉我的英语不好(