我是 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_property
。 This question显示了该模式的示例。
即使模型对象上定义了自定义查询属性,使用 session.query
进行查询时也不会使用该属性,如第二个示例中的最后一行所示。这意味着如果您需要自定义查询类,第一个示例是唯一的选择。
关于python - SQLAlchemy 中的 Model.query 和 session.query(Model) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12350807/