web-dev-qa-db-fra.com

Flask Requête SQLAlchemy, spécifiez les noms des colonnes

Comment spécifier la colonne souhaitée dans ma requête à l'aide d'un modèle (toutes les colonnes sont sélectionnées par défaut)? Je sais comment faire cela avec la session sqlalchmey: session.query(self.col1), mais comment puis-je le faire avec des modèles? Je ne peux pas faire SomeModel.query(). Y a-t-il un moyen?

90
Matthew Scragg

Vous pouvez utiliser la méthode with_entities() pour limiter les colonnes à renvoyer dans le résultat. ( documentation )

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)

Selon vos besoins, vous pouvez également trouver différé utile. Ils vous permettent de renvoyer l'objet complet mais limitent les colonnes qui passent par le fil.

171
David McKeone
session.query.with_entities(SomeModel.col1)

est le même que

session.query(SomeModel.col1)

pour alias, nous pouvons utiliser .label ()

session.query(SomeModel.col1.label('some alias name'))
51
Salil

Vous pouvez utiliser la fonction load_only :

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(Company).options(load_only(*fields)).all()

où 'Société' est votre modèle (dans votre cas, il s'agit de SomeModel)

22
Vlad Bezden

Vous pouvez utiliser Model.query, Car le Model (ou généralement sa classe de base, en particulier dans les cas où l'extension déclarative est utilisée) est attribué Sesssion.query_property . Dans ce cas, le Model.query Équivaut à Session.query(Model).

Je ne suis pas au courant de la façon de modifier les colonnes renvoyées par la requête (sauf en ajoutant davantage en utilisant add_columns() ).
Votre meilleure solution consiste donc à utiliser la Session.query(Model.col1, Model.col2, ...) (comme l'a déjà montré Salil).

10
van