【问题标题】:What's the difference between Model.query and session.query(Model) in SQLAlchemy?SQLAlchemy 中的 Model.query 和 session.query(Model) 有什么区别?
【发布时间】:2012-09-03 06:25:24
【问题描述】:

我是 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(...)

它们之间有什么区别吗?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    另一个 SQLAlchemy 问题的答案 (here) 可能会有所帮助。这个答案开始于:

    您可以使用Model.query,因为Model(或通常是它的基类,尤其是在使用声明性扩展的情况下)被分配了Session.query_property。在这种情况下,Model.query 等同于 Session.query(Model)

    【讨论】:

      【解决方案2】:

      我看到query_property 的这些缺点:

      • 您不能在与您配置的会话不同的会话上使用它(尽管那时您始终可以使用session.query)。
      • 在定义架构之前,您需要一个可用的会话对象。

      例如,当你想编写测试时,这些可能会咬你。

      另外,session.query 更适合 SQLAlchemy 的工作方式; query_property 看起来只是为了方便而添加在顶部(或与其他系统相似?)。 我建议你坚持session.query

      【讨论】:

        【解决方案3】:

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

        • query 属性明确绑定到DBSession
        • 没有自定义Query 对象传递给query_property

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

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

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

        【讨论】:

          猜你喜欢
          • 2017-02-22
          • 2021-07-27
          • 1970-01-01
          • 2011-08-03
          • 1970-01-01
          • 2020-06-05
          • 2016-02-14
          • 2018-04-21
          • 1970-01-01
          相关资源
          最近更新 更多