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 filter
kwargs 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 == id
olarak değerlendirir True
ve 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 *args
ve **kwargs
bir 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 == expression
ve arasındaki farkı hala aşıyorlar keyword = expression
. Bu yüzden onları ayırdık.
column == expression
vs. keyword = expression
arasındaki fark hakkında yapmak için kilit noktasıdır filter
ve filter_by
. Teşekkürler!
filter_by
biraz daha hızlı olabileceğini düşünüyordum filter
.
filter_by
, alan adı için bu sınıf için, flter
en 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_by
anahtar kelime bağımsız değişkenlerini kullanır, buna karşılık filter
pythonic 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 get
yö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 / get
küçü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.filter
ilgili 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.