from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from setting import EREBUS_DB_CONNECT_STRING from contextlib import contextmanager # 创建数据库引擎,echo为True,会打印所有的sql语句 engine = create_engine(EREBUS_DB_CONNECT_STRING, echo=True, pool_size=250, max_overflow=50, pool_recycle=300)# 创建会话类 db_session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine,expire_on_commit=True))# 创建会话对象 @contextmanager def session(): #生成器函数try:session = db_session()session.expire_on_commit = Falseyield sessionexcept:session.rollback()finally:session.close()
装饰器@contextmanager 只是省略了 __enter__() / __exit__() 的编写,但并不负责实现资源的“获取”和“清理”工作;“获取”操作需要定义在 yield 语句之前,“清理”操作需要定义 yield 语句之后,这样 with 语句在执行 __enter__() / __exit__() 方法时会执行这些语句以获取/释放资源,即生成器函数中需要实现必要的逻辑控制,包括资源访问出现错误时抛出适当的异常
参考:
1、https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/index.html
2、https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001478651770626de401ff1c0d94f379774cabd842222ff000