Flask SQLAlchemy query, specificare i nomi delle colonne


126

Come faccio a specificare la colonna che desidero nella mia query utilizzando un modello (seleziona tutte le colonne per impostazione predefinita)? So come farlo con la sessione sqlalchmey:, session.query(self.col1)ma come lo faccio con i modelli? Non posso farlo SomeModel.query(). C'è un modo?

Risposte:


221

Puoi utilizzare il with_entities()metodo per limitare le colonne che desideri restituire nel risultato. ( documentazione )

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

A seconda delle tue esigenze, potresti trovare utili anche i differiti . Ti consentono di restituire l'intero oggetto ma limitano le colonne che passano sul filo.


21
with_entities () fa sì che all () restituisca tuple di valori di colonna, non oggetti!
kolypto

10
kolypto: Produce qualunque cosa tu chieda di cedere. SomeModel.query.with_entities (SomeModel) restituirebbe l'oggetto. Proprio come session.query (SomeModel.col1, SomeModel.col2) produrrebbe tuple di valori di colonna. I differiti sono ciò che useresti se non vuoi che le colonne arrivino sul filo, ma vuoi comunque l'intero oggetto.
David McKeone

2
Grazie funziona. Ma come potremmo assegnare alias al campo? Perché nel mio caso, sto usando JOIN e il IDcampo di conflitto che è presente in entrambe le tabelle
Mitul Shah

Sì, ho la stessa domanda con @MitulShah, come impostare l'alias?
Nam G VU

Per l'alias, visualizza questa breve risposta di seguito, ad es. usa .label() stackoverflow.com/a/11535992/248616
Nam G VU

69
session.query().with_entities(SomeModel.col1)

equivale a

session.query(SomeModel.col1)

come alias, possiamo usare .label ()

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

2
Il secondo sembra più logico ed è più breve - win / win
fgblomqvist

7
La tua prima affermazione è sbagliata. Hai bisogno di parentesi. Quindi, dovrebbe leggere:session.query().with_entities(SomeModel.col1)
JGFMK

La prima (e la terza) opzione sono di gran lunga le migliori se si desidera riutilizzare oggetti di query esistenti, specialmente nel caso di eseguire più sottoquery complesse.
Jamie Strauss

36

Puoi usare la funzione load_only :

from sqlalchemy.orm import load_only

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

1
Questa soluzione è la migliore in quanto funziona ancora come un oggetto non solo l'elenco dei risultati.
rborodinov

Complimenti a te per questa soluzione. Ha molti vantaggi: - restituisce esattamente lo stesso tipo di oggetto di .first()e .one()(che caricherà campi e relazioni pigro / desideroso), - può essere impostato come componente di query
Damien

il codice è pulito ma la query sql seleziona tutti i campi dal database. Ho usato with_entitiesquanto indicato nella risposta accettata e la query ha selezionato solo quei campi /.
Srikanth Jeeva

11

È possibile utilizzare Model.query, perché Modelviene assegnata la (o solitamente la sua classe base, specialmente nei casi in cui viene utilizzata l'estensione dichiarativa) Sesssion.query_property. In questo caso Model.queryè equivalente a Session.query(Model).

Non sono a conoscenza del modo in cui modificare le colonne restituite dalla query (tranne aggiungendone altre utilizzando add_columns()).
Quindi il tuo colpo migliore è usare il Session.query(Model.col1, Model.col2, ...)(come già mostrato da Salil).


Credo che ci possa essere anche un modo per farlo con un elenco di colonne anche per i valori di query (), docs.sqlalchemy.org/en/latest/orm/… - ma lo zucchero sintattico per l'elenco mi sfugge al momento.
JGFMK


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.