12

为什么我总是需要在 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)
4

2 回答 2

17

存在的原因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()作为该可调用函数的默认值。

于 2013-04-01T20:40:18.513 回答
1

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

试着pprint看看里面有什么;

import pprint
pprint.pprint(my_session)

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

于 2013-04-01T19:58:27.353 回答