Flask SQLAlchemy sorgusu, sütun adlarını belirtin


126

Sorgumda istediğim sütunu bir model kullanarak nasıl belirtebilirim (varsayılan olarak tüm sütunları seçer)? Bunu sqlalchmey oturumuyla session.query(self.col1)nasıl yapacağımı biliyorum : ama bunu modellerle nasıl yaparım? Yapamam SomeModel.query(). Bir yolu var mı?

Yanıtlar:


221

with_entities()Sonuçta döndürmek istediğiniz sütunları kısıtlamak için yöntemi kullanabilirsiniz . ( belgeler )

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

Gereksinimlerinize bağlı olarak, ertelenmişleri de yararlı bulabilirsiniz . Tüm nesneyi geri getirmenize izin verir, ancak telin üzerinden gelen sütunları kısıtlar.


21
with_entities (), nesnelerin değil, sütun değerlerinin tümünü () verir!
kolypto

10
kolypto: Vermesini istediğiniz her şeyi verir. SomeModel.query.with_entities (SomeModel) nesneyi verir. Tıpkı session.query gibi (SomeModel.col1, SomeModel.col2) sütun değerlerinin demetlerini verir. Telden sütunların gelmesini istemiyorsanız, ancak yine de tüm nesneyi istiyorsanız, kullanacağınız şey ertelenmişlerdir.
David McKeone

2
Teşekkürler işe yarıyor. Ancak alana nasıl takma ad atayabiliriz? Çünkü benim durumumda, IDher iki tabloda da bulunan JOIN ve çatışma alanını kullanıyorum
Mitul Shah

Evet @MitulShah ile aynı sorum var, takma ad nasıl ayarlanır?
Nam G VU

Takma ad için, aşağıdaki bu kısa yanıtı inceleyin, örn. .label() stackoverflow.com/a/11535992/248616
Nam G VU

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

aynıdır

session.query(SomeModel.col1)

takma ad için .label () kullanabiliriz

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

2
İkincisi hem daha mantıklı hem de daha kısa - kazan / kazan
fgblomqvist

7
İlk ifadeniz yanlış. Parantezlere ihtiyacınız var. Öyleyse, şöyle olmalıdır:session.query().with_entities(SomeModel.col1)
JGFMK

Mevcut sorgu nesnelerini yeniden kullanmak istiyorsanız, özellikle birden çok karmaşık alt sorgu gerçekleştirme durumunda, birinci (ve üçüncü) seçenekler açık ara en iyisidir.
Jamie Strauss

36

Load_only işlevini kullanabilirsiniz :

from sqlalchemy.orm import load_only

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

1
Bu çözüm, yalnızca sonuç listesi olarak değil, hala bir Nesne olarak çalıştığı için en iyisidir.
rborodinov

Bu çözüm için tebrikler. Tam olarak nesnenin aynı türde dönüşünü -: Pek çok avantajı vardır .first()ve .one()(yani tembel / istekli yük alanları ve ilişkiler olacak), - Sorgu bileşeni olarak ayarlanabilir
Damien

kod temizdir ancak sql sorgusu tüm alanları veritabanından seçer. with_entitiesKabul edilen cevapta verildiği gibi kullandım ve sorguyu sadece bu alanları / seçti.
Srikanth Jeeva

11

Kullanabilirsiniz Model.query, çünkü Model(veya genellikle temel sınıfı, özellikle bildirime dayalı uzantının kullanıldığı durumlarda) atanır Sesssion.query_property. Bu durumda Model.queryeşdeğerdir Session.query(Model).

Sorgu tarafından döndürülen sütunları değiştirmenin yolunun farkında değilim (kullanarak daha fazla ekleme dışında add_columns()).
Yani en iyi Session.query(Model.col1, Model.col2, ...)atışınız (Salil tarafından daha önce gösterildiği gibi) kullanmaktır.


Bunu sorgu değerleri () için bir sütun listesiyle de yapmanın bir yolu olabileceğine inanıyorum, docs.sqlalchemy.org/en/latest/orm/… - ancak listenin sözdizimsel şekeri şu anda benden kaçıyor .
JGFMK


-11

Burada bir örnek:

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

<> 0 derecelendirmesine sahip filmler için db'yi sorguladım ve sonra onları önce en yüksek derecelendirmeye sahip derecelendirmeye göre sıraladım.

Buraya bir göz atın: Flask-SQLAlchemy'de Seç, Ekle, Sil

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.