Yanıtlar:
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'))
type(model.column_name == 'asdf')→sqlalchemy.sql.elements.BinaryExpression
.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.
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.
column == expressionvs. keyword = expressionarasındaki fark hakkında yapmak için kilit noktasıdır filterve filter_by. Teşekkürler!
filter_bybiraz daha hızlı olabileceğini düşünüyordum filter.
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.
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")
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)
users.filterilgili kişiden. Ve benim hatam olabilir :) queryözelliği query_property ve bugünlerde oldukça standart bir şeker
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.