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