python - sqlalchemy:为什么在将它分配给 Session 对象之前创建一个 sessionmaker?

标签 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)

最佳答案

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/

相关文章:

python - 如何标准化获得单一颜色的颜色?

sql - Perl:DBIx::Class 初学者 - 子集关系和预取

java - Tomcat 8.0.32 : sometimes it ignores cookies. 的奇怪行为是否可以以某种方式进行调试?

python - 如何使用 Django 查询检查数据库字段的所有值是否相同

php - Kohana orm 命令升序/降序?

python - 打印函数中的模数计算?

python - 属性错误: module 'pytesseract' has no attribute 'run_tesseract'

python - 即使在设置 LANG 和 LC_ALL 后,在 mod_wsgi 中运行时也会出现 UnicodeEncodeError

java - 在 session 期间保持 Java 对象处于 Activity 状态

php - 什么时候 session 数据可用?