SQLAlchemy db.session.query()与model.query

SQLAlchemy db.session.query()与model.query,sqlalchemy,Sqlalchemy,对于一个简单的返回所有结果查询,一种方法是否应该优先于另一种?我可以在网上找到这两种方法的用法,但实际上找不到任何描述其差异的东西 db.session.query([my model name]).all() [my model name].query.all() 我觉得[my model name].query.all()更具描述性。很难给出明确的答案,因为回答这个问题时存在高度的偏好主观性 从一个角度来看,db.session是需要的,因为第二种方法要求它作为一个附加步骤合并到您的模型

对于一个简单的返回所有结果查询,一种方法是否应该优先于另一种?我可以在网上找到这两种方法的用法,但实际上找不到任何描述其差异的东西

db.session.query([my model name]).all()

[my model name].query.all()

我觉得[my model name].query.all()更具描述性。

很难给出明确的答案,因为回答这个问题时存在高度的偏好主观性

从一个角度来看,db.session是需要的,因为第二种方法要求它作为一个附加步骤合并到您的模型中——默认情况下它不是基类的一部分。例如:

Base = declarative_base()
DBSession = scoped_session(sessionmaker())
class User(Base):
   __tablename__ = 'users'

   id = Column(Integer, primary_key=True)
   name = Column(String)
   fullname = Column(String)
   password = Column(String)
session = Session()
print(User.query)
该代码失败,出现以下错误:

AttributeError:类型对象“用户”没有属性“查询”

您需要这样做:

class User(Base):
   __tablename__ = 'users'

   id = Column(Integer, primary_key=True)
   name = Column(String)
   fullname = Column(String)
   password = Column(String)
   query = DBSession.query_property()
然而,也有人认为,仅仅因为它在默认情况下没有启用,这并不意味着它作为启动查询的合理方式无效。此外,在flask sqlalchemy包(它简化了sqlalchemy与flask web框架的集成)中,这已经作为模型类的一部分为您完成了。在sqlalchemy教程中还可以看到向模型添加查询属性:

因此,人们可能会争论这两种方法

当我从单个表中进行选择时,我个人更喜欢第二种方法。例如:

serv = Service.query.join(Supplier, SupplierUsr).filter(SupplierUsr.username == usr).all()
这是因为它的行长度较小,并且仍然易于阅读

如果我从多个表中选择或指定列,那么我将使用模型查询方法从多个模型中提取信息

deliverables = db.session.query(Deliverable.column1, BatchInstance.column2).\
    join(BatchInstance, Service, Supplier, SupplierUser). \
    filter(SupplierUser.username == str(current_user)).\
    order_by(Deliverable.created_time.desc()).all()
这就是说,始终使用session.query方法可能会产生一个反论点,因为它使代码更加一致,并且当从左到右阅读时,读者在意识到涉及哪些表和列之前,立即知道他们将要阅读的sqlalchemy指令将是query


归根结底,你的问题的答案是主观的,没有正确的答案,任何代码可读性的好处都是微不足道的。我看到的唯一好处是,如果您从许多表中进行选择,则不使用模型查询,而是使用session.query方法。

请参阅我更喜欢后者,除非您只需要模型中的特定列。在这种情况下,执行db.session.query(Model.column_1,Model.column_2)
deliverables = db.session.query(Deliverable.column1, BatchInstance.column2).\
    join(BatchInstance, Service, Supplier, SupplierUser). \
    filter(SupplierUser.username == str(current_user)).\
    order_by(Deliverable.created_time.desc()).all()