代码之家  ›  专栏  ›  技术社区  ›  Nathan Wailes

如何在使用全局SQLAlchemy会话对象时防止未关闭的数据库连接?

  •  0
  • Nathan Wailes  · 技术社区  · 6 年前

    我在一家公司工作,负责一个项目,在这个项目中,使用一个全局会话变量应该没问题:

    例子

    /src/__init__.py (程序的入口点):

    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine('mysql://%s:%s@%s/%s' % (username, password, host, db_name))
    Session = sessionmaker(bind=engine)
    session = Session()
    
    
    def main():
        from src.example import example_function
    
        example_function()
    
    
    if __name__ == '__main__':
        main()
    

    /src/example.py (将会话导入另一个文件的示例):

    from src import session
    
    def example_function():
        objects = session.query(ExampleTable).all()
    

    但是,我很难理解如何确保在程序遇到异常时关闭这个全局会话对象 没有 需要通过函数参数传递会话对象。

    我不想做的事的例子

    /src/初始化py (程序的入口点):

    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    engine = create_engine('mysql://%s:%s@%s/%s' % (username, password, host, db_name))
    Session = sessionmaker(bind=engine)
    
    
    def main(session):
        from src.example import example_function
    
        example_function(session)
    
    
    if __name__ == '__main__':
        try:
            session = Session()
            main(session)
        finally:
            session.close()
    

    /src/示例.py (在另一个文件中使用会话对象的示例):

    def example_function(session):
        objects = session.query(ExampleTable).all()
    
    0 回复  |  直到 6 年前