python - SQLAlchemy 中的 Model.query 和 session.query(Model) 有什么区别?

标签 python sqlalchemy

我是 SQLAlchemy 的初学者,发现查询可以通过 2 种方法完成:

方法一:

DBSession = scoped_session(sessionmaker())
class _Base(object):
    query = DBSession.query_property()

Base = declarative_base(cls=_Base)

class SomeModel(Base):
    key   = Column(Unicode, primary_key=True)
    value = Column(Unicode)

# When querying
result = SomeModel.query.filter(...)

方法 2

DBSession = scoped_session(sessionmaker())
Base = declarative_base()

class SomeModel(Base):
    key   = Column(Unicode, primary_key=True)
    value = Column(Unicode)

# When querying
session = DBSession()
result = session.query(SomeModel).filter(...)

它们之间有什么区别吗?

最佳答案

在上面的代码中,没有区别。这是因为,在第一个示例的第 3 行:

  • query 属性显式绑定(bind)到 DBSession
  • 没有自定义 Query 对象传递给 query_property

正如@petr-viktorin 在 answer here 中指出的那样,在您在第一个示例中定义模型之前,必须有一个可用的 session ,这可能会根据您的应用程序的结构存在问题。

但是,如果您需要一个自定义查询来自动向所有查询添加额外的查询参数,那么只有第一个示例允许这样做。从 sqlalchemy.orm.query.Query 继承的自定义查询类可以作为参数传递给 query_propertyThis question显示了该模式的示例。

即使模型对象上定义了自定义查询属性,使用 session.query 进行查询时也不会使用该属性,如第二个示例中的最后一行所示。这意味着如果您需要自定义查询类,第一个示例是唯一的选择。

关于python - SQLAlchemy 中的 Model.query 和 session.query(Model) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12350807/

相关文章:

python - 如何使用不同大小的 host_subplots 保存我的图表?

python - SQLAlchemy 可以自动从数据库模式创建关系吗?

python - 使用 pandas 写入 sql 数据库

mysql - 使用 `sqlalchemy.types.JSON` 数据类型通过 SQLAlchemy 查询 JSON

python - Flask 属性错误与 unpickling

python - 使用 Pytorch 实现 FFT

python - 如果我不说话,语音识别就会停止,如何让它继续听

python - 原始数据异常 : You cannot access body after reading from request's data stream

python - 使用 session.query 通过 SQLAlchemy ORM 更新连接表

python - 何时提交数据库连接?