sqlalchemy:为什么在将会话制作者分配给Session对象之前创建会话制作者?

时间:2013-04-01 19:44:23

标签: python session orm sqlalchemy

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

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

尝试pprint并查看内部的内容;

import pprint
pprint.pprint(my_session)

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