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 == id
sebagai True
dan 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 *args
dan **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 == expression
dan keyword = expression
. Jadi kami membaginya.
column == expression
vs keyword = expression
adalah poin kunci untuk membuat perbedaan antara filter
dan filter_by
. Terima kasih!
filter_by
mungkin sedikit lebih cepat daripada filter
.
filter_by
adalah untuk dapat menulis menjorok nama bidang, untuk kelas itu, tidak ada pertanyaan yang diajukan - sementara flter
membutuhkan 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_by
menggunakan argumen kata kunci, sedangkan filter
memungkinkan 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 get
metode:
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
Ketika menggunakan get
case, penting bahwa objek dapat dikembalikan tanpa permintaan basis data identity map
yang dapat digunakan sebagai cache (terkait dengan transaksi)
users.filter
dari jawaban sebelumnya. Dan mungkin itu salahku :) query
atribut 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.