最后尝试使用 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 中,会话在每个网络请求开始时创建,并在请求结束时关闭。
我习惯这样做:
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 中,会话在每个网络请求开始时创建,并在请求结束时关闭。