我习惯这样做:
from sqlalchemy.orm import sessionmaker
from sqlalchemy.engine import create_engine
Session = sessionmaker()
engine = create_engine("some connection db string", echo=False)
Session.configure(bind=engine)
db_con = Session()
try:
# DB MANIPULATION
finally:
db_con.close()
这是一个好习惯吗?如果是这样,为什么sqlalchemy不允许你这样做:
with Session() as db_con:
# DB MANIPULATION
答案 0 :(得分:1)
不,这不是好习惯。它很容易忘记,并会使代码更加混乱。
相反,您可以使用contextlib.closing
上下文管理器,并将其作为获取会话的唯一方法。
# Wrapped in a custom context manager for better readability
@contextlib.contextmanager
def get_session():
with contextlib.closing(Session()) as session:
yield session
with get_session() as session:
session.add(...)
答案 1 :(得分:0)
首先,如果您已完成会话对象,则应关闭会话。 session.close 会将连接返回到引擎池,如果您要退出该程序,则应使用 engine.dispose 处理引擎池。
现在回答你的问题。在大多数情况下,会话将用于长期运行的应用程序,如Web服务器。在哪里集中管理会话是有意义的。例如,在flask-sqlalchemy会话中创建了每个Web请求的开始,并在请求结束时关闭。