SQLAlchemy'de filter ve filter_by arasındaki fark


304

Herkes SQLAlchemy arasındaki fark filterve filter_byfonksiyonları açıklayabilir misiniz ? Hangisini kullanmalıyım?

Yanıtlar:


393

filter_by gibi normal kwargs kullanan sütun adlarındaki basit sorgular için kullanılır.

db.users.filter_by(name='Joe')

Aynı şey filterkwargs kullanılarak değil, db.users.name nesnesine aşırı yüklenmiş '==' eşitlik operatörü kullanılarak gerçekleştirilebilir:

db.users.filter(db.users.name=='Joe')

Ayrıca filter, aşağıdakiler gibi ifadeler gibi daha güçlü sorgular da yazabilirsiniz :

db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))


22
Bu başlık altında nasıl çalışır? Olmaz db.users.name=='Ryan'bir sabite kez değerlendirmek ve daha sonra o andan itibaren anlamsız? Bunun çalışması için bir lambda kullanmanız gerekecek gibi görünüyor.
Hamish Grubijan

46
eşitlik operatörü aşırı yüklü
Daniel Velkov

9
type(model.column_name == 'asdf')sqlalchemy.sql.elements.BinaryExpression
Nick T

11
Kullanırken dikkatli olun .filter. Böyle bir sorgu id=12345, query(users).filter(id == id)filtre uygulamak olmaz users.id. Bunun yerine, id == idolarak değerlendirir Trueve tüm kullanıcıları döndürür. Kullanmanız gerekir .filter(users.id == id)(yukarıda gösterildiği gibi). Bu hatayı bugün daha önce yaptım.
Nico Cernek

118

Bunları aslında bir araya getirdik, yani kabul edilen *argsve **kwargsbir SQL ifadesini veya anahtar kelime argümanlarını (veya her ikisini) iletebileceğiniz bir "filtre" benzeri yöntem vardı . Aslında bunu çok daha uygun buluyorum, ama insanlar her zaman onunla karıştırıldı, çünkü genellikle column == expressionve arasındaki farkı hala aşıyorlar keyword = expression. Bu yüzden onları ayırdık.


30
Ben yaklaşık puanınızı düşünmek column == expressionvs. keyword = expressionarasındaki fark hakkında yapmak için kilit noktasıdır filterve filter_by. Teşekkürler!
Hollister

2
Ben bu aptalca bir soru ise sqlalchemy yeniyim, ama özür dilerim, ama filter_by () "price> = 100" gibi çok basit koşullara bile izin vermiyor gibi görünüyor. Öyleyse, neden "price = 100" gibi en basit koşul için kullanabiliyorsanız, filter_by () işlevini yine de kullanalım?
PawelRoman

18
çünkü insanlar bunu
seviyor

3
Aralarında herhangi bir performans farkı var mı? Bunun filter_bybiraz daha hızlı olabileceğini düşünüyordum filter.
Devi

6
Kullanım noktası filter_by, alan adı için bu sınıf için, flteren azından gereksiz bir sınıf adı yazmak (ve okumak için) gerektiren bir soru sorulur - asıl sütun nesnesini gerektirir - jut yazabilmektir . Yani, eğer kişi eşitliğe göre filtrelemek isterse, oldukça uygundur.
jsbueno

36

filter_byanahtar kelime bağımsız değişkenlerini kullanır, buna karşılık filterpythonic filtreleme bağımsız değişkenlerinefilter(User.name=="john")


34

Daha hızlı sorgu yazma için bir sözdizimi şekeri. Sahte kodda uygulanması:

def filter_by(self, **kwargs):
    return self.filter(sql.and_(**kwargs))

AND için şunları yazabilirsiniz:

session.query(db.users).filter_by(name='Joe', surname='Dodson')

btw

session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England'))

olarak yazılabilir

session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))

Ayrıca getyöntemi ile doğrudan PK tarafından nesne alabilirsiniz :

Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)

Büyük / getküçük harf kullanımı durumunda, nesnenin identity mapönbellek olarak kullanılabilen veritabanı işlemi olmadan döndürülmesi önemlidir (işlemle ilişkili)


Bu kod örnekleri yanıltıcıdır: Bildirici temel tablo sınıfları ve örneklerinde ne filtre ne de sorgu yöntemleri vardır; oturumu kullanırlar.
Kaplumbağalar Sevimli

Ben yeniden users.filterilgili kişiden. Ve benim hatam olabilir :) queryözelliği query_property ve bugünlerde oldukça standart bir şeker
enomad
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.