最后尝试使用 SqlAlchemy:这是一个好习惯吗?

try-finally with SqlAlchemy: is this a good habit?

我习惯这样做:

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

?

不,这不是好的做法。容易忘记,会使代码更混乱。

相反,您可以使用 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(...)

首先,如果您完成了会话对象,您应该关闭会话。 session.close 将 return 连接回引擎池,如果您要退出程序,您应该使用 [=20= 处理引擎池].

现在回答你的问题。在大多数情况下,会话将用于较长的 运行 应用程序,如 Web 服务器。集中会话管理有意义的地方。例如,在 flask-sqlalchemy 中,会话在每个网络请求开始时创建,并在请求结束时关闭。