Adakah yang bisa menjelaskan perbedaan antara filter
dan filter_by
fungsi dalam SQLAlchemy? Yang mana yang harus saya gunakan?
python
sqlalchemy
bodacydo
sumber
sumber
db.users.name=='Ryan'
mengevaluasi sekali ke konstanta dan kemudian menjadi tidak berarti sejak saat itu? Sepertinya orang perlu menggunakan lambda agar ini berfungsi.type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. kueri sepertiid=12345
,query(users).filter(id == id)
tidak akan difilterusers.id
. Sebaliknya, ia akan mengevaluasiid == id
sebagaiTrue
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 antaracolumn == expression
dankeyword = expression
. Jadi kami membaginya.sumber
column == expression
vskeyword = expression
adalah poin kunci untuk membuat perbedaan antarafilter
danfilter_by
. Terima kasih!filter_by
mungkin sedikit lebih cepat daripadafilter
.filter_by
adalah untuk dapat menulis menjorok nama bidang, untuk kelas itu, tidak ada pertanyaan yang diajukan - sementaraflter
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, sedangkanfilter
memungkinkan argumen penyaringan pythonic sukafilter(User.name=="john")
sumber
Ini adalah gula sintaks untuk penulisan kueri yang lebih cepat. Implementasinya dalam pseudocode:
Untuk DAN Anda cukup menulis:
btw
dapat ditulis sebagai
Anda juga bisa mendapatkan objek secara langsung dengan PK melalui
get
metode:Ketika menggunakan
get
case, penting bahwa objek dapat dikembalikan tanpa permintaan basis dataidentity map
yang dapat digunakan sebagai cache (terkait dengan transaksi)sumber
users.filter
dari jawaban sebelumnya. Dan mungkin itu salahku :)query
atribut adalah query_property dan gula yang cukup standar saat ini