为什么我总是需要在 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)
最佳答案
sessionmaker()
存在的原因是它需要的各种“配置”参数只需要在一个地方设置,而不是重复“bind=engine, autoflush=False, expire_on_commit =False”,等等,一遍又一遍。此外,sessionmaker()
提供了一个“可更新”接口(interface),这样您就可以在应用程序的某处设置它:
session = sessionmaker(expire_on_commit=False)
但是稍后,当您知道正在与哪个数据库通话时,您可以向其添加配置:
session.configure(bind=create_engine("some engine"))
它也作为一个“可调用”传递给非常常见的 scoped_session()
结构:
session = scoped_session(sessionmaker(bind=engine))
综上所述,这些只是文档引用的约定,以便呈现一致的“如何使用”故事。如果更方便的话,没有理由不直接使用构造函数,我一直使用 Session()
构造函数。只是在一个非平凡的应用程序中,您可能最终会将对 Session()
的构造函数调用坚持到某种可调用函数中,sessionmaker()
用作该可调用对象的默认值。
关于python - sqlalchemy:为什么在将它分配给 Session 对象之前创建一个 sessionmaker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15750557/