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

时间:2016-05-09 19:17:10

标签: python database sqlalchemy with-statement

我习惯这样做:

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

2 个答案:

答案 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请求的开始,并在请求结束时关闭。