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

71

我是SQLAlchemy的初学者,在学习时发现可以有两种方法进行查询:

方法一:

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

方法二

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个回答

21
在上述代码中,没有区别。这是因为在第一个例子的第3行中:
  • query属性明确绑定到DBSession
  • 没有自定义的Query对象传递给query_property
正如@petr-viktorin在这里的答案中指出的那样,在你定义第一个示例中的模型之前必须有一个会话可用,这可能会根据应用程序的结构而有问题。
如果您需要自定义查询并自动向所有查询添加其他查询参数,则只有第一个示例才允许这样做。可以将从sqlalchemy.orm.query.Query继承的自定义查询类作为参数传递给query_property这个问题展示了这种模式的一个例子。
即使模型对象定义了自定义查询属性,当使用session.query进行查询时也不会使用该属性,就像第二个示例中的最后一行一样。这意味着如果需要自定义查询类,则类似于第一个示例是唯一的选择。

6
一个不同的SQLAlchemy问题的答案(在这里)可能会有所帮助。那个答案是这样开始的:
引用: 你可以使用Model.query,因为Model(通常是它的基类,尤其是在使用声明性扩展的情况下)被分配了Session.query_property。在这种情况下,Model.query等同于Session.query(Model)。

6
我看到了query_property的以下缺点:
  • 您不能在不同于您配置的会话上使用它(尽管您始终可以使用session.query)。
  • 您需要在定义架构之前有可用的会话对象。

例如,当您想编写测试时,这些问题可能会影响您。

此外,session.query更适合SQLAlchemy的工作方式;query_property似乎只是为了方便(或与其他系统相似性?)而添加的。我建议您坚持使用session.query


我刚刚被咬了。这个评论是正确的。 - Xoel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接