Jawaban:
filter_by digunakan untuk pertanyaan sederhana pada nama kolom menggunakan kwarg biasa, seperti
db.users.filter_by(name='Joe')
Hal yang sama dapat dilakukan dengan filter, tidak menggunakan kwargs, melainkan menggunakan operator persamaan '==', yang telah kelebihan beban pada objek db.users.name:
db.users.filter(db.users.name=='Joe')
Anda juga dapat menulis kueri yang lebih kuat menggunakan filter, seperti ekspresi seperti:
db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))
type(model.column_name == 'asdf')→sqlalchemy.sql.elements.BinaryExpression
.filter. kueri seperti id=12345, query(users).filter(id == id)tidak akan difilter users.id. Sebaliknya, ia akan mengevaluasi id == idsebagai Truedan mengembalikan semua pengguna. Anda perlu menggunakan .filter(users.id == id)(seperti yang ditunjukkan di atas). Saya membuat kesalahan ini sebelumnya hari ini.
Kami sebenarnya menggabungkan ini bersama-sama pada awalnya, yaitu ada metode "filter" yang diterima *argsdan **kwargs, di mana Anda dapat menyampaikan argumen SQL atau argumen kata kunci (atau keduanya). Sebenarnya saya merasa jauh lebih nyaman, tetapi orang-orang selalu bingung karenanya, karena mereka biasanya masih bisa mengatasi perbedaan antara column == expressiondan keyword = expression. Jadi kami membaginya.
column == expressionvs keyword = expressionadalah poin kunci untuk membuat perbedaan antara filterdan filter_by. Terima kasih!
filter_bymungkin sedikit lebih cepat daripada filter.
filter_byadalah untuk dapat menulis menjorok nama bidang, untuk kelas itu, tidak ada pertanyaan yang diajukan - sementara fltermembutuhkan objek kolom yang sebenarnya - yang biasanya akan membutuhkan satu untuk mengetik (dan membaca) setidaknya nama kelas yang berlebihan. Jadi, jika seseorang ingin menyaring berdasarkan kesetaraan, itu lebih mudah.
filter_bymenggunakan argumen kata kunci, sedangkan filtermemungkinkan argumen penyaringan pythonic sukafilter(User.name=="john")
Ini adalah gula sintaks untuk penulisan kueri yang lebih cepat. Implementasinya dalam pseudocode:
def filter_by(self, **kwargs):
return self.filter(sql.and_(**kwargs))
Untuk DAN Anda cukup menulis:
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'))
dapat ditulis sebagai
session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))
Anda juga bisa mendapatkan objek secara langsung dengan PK melalui getmetode:
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
Ketika menggunakan getcase, penting bahwa objek dapat dikembalikan tanpa permintaan basis data identity mapyang dapat digunakan sebagai cache (terkait dengan transaksi)
users.filterdari jawaban sebelumnya. Dan mungkin itu salahku :) queryatribut adalah query_property dan gula yang cukup standar saat ini
db.users.name=='Ryan'mengevaluasi sekali ke konstanta dan kemudian menjadi tidak berarti sejak saat itu? Sepertinya orang perlu menggunakan lambda agar ini berfungsi.