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.