对于简单的返回,所有结果查询应该优先于另一种方法吗?我可以在网上找到两种用途,但无法找到描述差异的任何内容。
db.session.query([my model name]).all()
[my model name].query.all()
我觉得[我的模型名称] .query.all()更具描述性。
答案 0 :(得分:4)
很难给出明确的答案,因为在回答这个问题时存在高度的偏好主观性。
从一个角度来看,db.session是理想的,因为第二种方法要求将它作为一个附加步骤合并到模型中 - 默认情况下它不是Base类的一部分。例如:
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:type object' User'没有属性'查询'
你需要做这样的事情:
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集成到烧瓶网框架中),这已经作为Model类(doc)的一部分为您完成。在sqlalchemy教程(doc)中可以看到将查询属性添加到模型中:
class User(object):
query = db_session.query_property()
....
因此,人们可以争论任何一种方法。
当我从一张桌子中选择时,我个人偏好第二种方法。例如:
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方法时使用counter参数,因为它使代码更加一致,并且当从左向右阅读时,读者立即知道他们将要读取的sqlalchemy指令将是查询,在精神上吸收涉及的表和列之前。
在一天结束时,您的问题的答案是主观的,并且没有正确的答案,并且任何代码可读性的好处都很小。如果您从许多表中进行选择而不是使用session.query方法,那么我唯一看到强大好处的是不使用模型查询。