Consulta Flask SQLAlchemy, especifique nomes de colunas


125

Como especifico a coluna que desejo na minha consulta usando um modelo (ele seleciona todas as colunas por padrão)? Eu sei como fazer isso com a sessão sqlalchmey:, session.query(self.col1)mas como faço com modelos? Eu não posso fazer SomeModel.query(). Há algum jeito?

Respostas:


220

Você pode usar o with_entities()método para restringir quais colunas você gostaria de retornar no resultado. ( documentação )

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

Dependendo dos seus requisitos, você também pode achar que os diferidos são úteis. Eles permitem retornar o objeto completo, mas restringem as colunas que passam pelo fio.


21
with_entities () faz com que all () produza tuplas de valores de coluna, não objetos!
— kolypto

10
kolypto: Produz o que você pede. SomeModel.query.with_entities (SomeModel) produziria o objeto. Assim como session.query (SomeModel.col1, SomeModel.col2) produziria tuplas de valores de coluna. Adiados são o que você usaria se não quiser que as colunas cheguem ao fio, mas deseje o objeto inteiro de qualquer maneira.
— David McKeone 06/02

2
Obrigado, funciona. Mas como podemos atribuir um alias ao campo? Porque no meu caso, estou usando JOIN e conflito IDcampo que está presente em ambos mesa
— Mitul Shah

Sim, eu tenho a mesma pergunta com @MitulShah, como definir alias?
— Nam G VU

Para o alias, veja esta breve resposta abaixo, ie. use .label() stackoverflow.com/a/11535992/248616
— Nam G VU

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

é o mesmo que

session.query(SomeModel.col1)

para alias, podemos usar .label ()

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

2
O segundo parece mais lógico e é mais curto - win / win
— fgblomqvist

7
Sua primeira afirmação está errada. Você precisa de parênteses. Assim, deve ler-se:session.query().with_entities(SomeModel.col1)
— JGFMK

As primeiras (e terceiras) opções são as melhores, de longe, se você deseja reutilizar objetos de consulta existentes, especialmente no caso de executar várias subconsultas complexas.
— 21319 Jamie Strauss

36

Você pode usar a função load_only :

from sqlalchemy.orm import load_only

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

1
Esta solução é a melhor, pois ainda está funcionando como um Objeto, não apenas na lista de resultados.
— rborodinov 02/07/19

Parabéns a você por esta solução. Tem muitas vantagens: - retorna exatamente o mesmo tipo de objeto que .first()e .one()(que carregará campos e relações preguiçosos / ansiosos), - pode ser definido como componente de consulta
— Damien

o código está limpo, mas a consulta sql seleciona todos os campos do banco de dados. Eu usei with_entitiescomo indicado na resposta aceita e a consulta selecionou apenas esses campos /.
— Srikanth Jeeva

11

Você pode usar Model.query, porque a Model(ou geralmente sua classe base, especialmente nos casos em que a extensão declarativa é usada) é atribuída Sesssion.query_property. Nesse caso, Model.queryé equivalente a Session.query(Model).

Não estou ciente da maneira de modificar as colunas retornadas pela consulta (exceto adicionando mais usando add_columns()).
Portanto, sua melhor chance é usar o Session.query(Model.col1, Model.col2, ...)(como já mostrado por Salil).


Acredito que também pode haver uma maneira de fazer isso com uma lista de colunas para valores de consulta (), docs.sqlalchemy.org/en/latest/orm/… - mas o açúcar sintático da lista me escapa no momento.
— JGFMK


-11

Um exemplo aqui:

movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()

Consulto o banco de dados para filmes com classificação <> 0 e, em seguida, ordeno-os classificando com a classificação mais alta primeiro.

Dê uma olhada aqui: Selecionar, Inserir, Excluir no Flask-SQLAlchemy

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.