sqlalchemy:为什么要在将sessionmaker分配给会话对象之前创建它?

2024-05-12 14:47:28 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么在SqlAlchemy中我总是需要分两步来完成?

import sqlalchemy as sa
import sqlalchemy.orm as orm

engine = sa.create_engine(<dbPath>, echo=True)
Session = orm.sessionmaker(bind=engine)
my_session = Session()

为什么我不能像这样一次性完成(这可能会更简单,不是吗?)以下内容:

import sqlalchemy as sa
import sqlalchemy.orm as orm

engine = sa.create_engine(<dbPath>, echo=True)
Session = orm.Session(bind=engine)

Tags: importechotruesqlalchemybindsessionmyas
2条回答

在最一般的意义上,会话建立与数据库的所有对话,并表示在其生命周期中加载或关联的所有对象的“保留区域”。它提供了获取查询对象的入口点,该查询对象使用会话对象的当前数据库连接将查询发送到数据库,将结果行填充到对象中,然后将这些对象存储在会话中,该对象位于名为Identity Map的结构中,Identity Map是一种数据结构,用于维护每个对象的唯一副本,其中“unique”表示“只有一个具有特定主键的对象”。

试着pprint看看里面是什么

import pprint
pprint.pprint(my_session)

下面是故事的其余部分:http://docs.sqlalchemy.org/ru/latest/orm/session.html

存在sessionmaker()的原因是,它所需的各种“配置”参数只需在一个地方设置,而不需要一遍又一遍地重复“bind=engine、autoflush=False、expire\on_commit=False”等。此外,sessionmaker()还提供了一个“可更新”接口,这样您就可以在应用程序中的某个地方设置它:

session = sessionmaker(expire_on_commit=False)

但稍后,当您知道要与哪个数据库通信时,可以向其中添加配置:

session.configure(bind=create_engine("some engine"))

它还充当一个“可调用”来传递给非常常见的scoped_session()构造:

session = scoped_session(sessionmaker(bind=engine))

尽管如此,这些只是文档所指的约定,以便呈现一致的“如何使用”故事。如果更方便的话,没有理由不能直接使用构造函数,我一直在使用Session()构造函数。只是,在一个不平凡的应用程序中,您可能最终会在某种可调用函数内部粘贴对Session()的构造函数调用,sessionmaker()作为该可调用函数的默认值。

相关问题 更多 >