Cara menggunakan fragmen untuk mengembalikan nilai saat memperbarui di Ecto

Saya perlu melakukan pembaruan di database dan mengembalikan nilai. Hal ini dapat dilakukan dengan menggunakan kata kunci RETURNING di PostgreSQL

Karena ini tidak didukung oleh ecto, saya rasa saya harus menggunakan fragmen tapi saya tidak yakin bagaimana melakukannya. Inilah yang saya punya:

query = from(v in MyModel, 
 where: v.id == ^instance_id, 
 update: [
   inc: [counter: 1], 
 ]
)

Saya ingin mengembalikan beberapa bidang setelah memperbarui, misalnya penghitung dan id, jadi saya perlu menambahkan ke kueri: RETURNING id, counter;


person Adrian Ribao    schedule 14.07.2016    source sumber


Jawaban (2)


Jika Anda menggunakan Ecto.Repo.update_all https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3 ada opsi :kembali lulus dengan daftar bidang yang kembali

:returning - memilih bidang mana yang akan dikembalikan. Jika benar, kembalikan semua bidang dalam struct yang diberikan. Mungkin berupa daftar bidang, di mana struct masih dikembalikan tetapi hanya dengan bidang yang diberikan. Atau salah, dimana tidak ada yang dikembalikan (default). Opsi ini tidak didukung oleh semua database.

Dan setelah eksekusi Anda dapat mengakses Tuple dengan ini:

Ia mengembalikan tupel yang berisi jumlah entri dan hasil apa pun yang dikembalikan sebagai elemen kedua. Jika database tidak mendukung RETURNING dalam pernyataan UPDATE atau tidak ada hasil pengembalian yang dipilih, elemen kedua akan menjadi nihil.

Sesuatu seperti ini:

result = from(v in MyModel, where: v.id == ^instance_id)
         |> MyRepo.update_all([inc: [counter: 1]], returning: [id, counter])
person neydroid    schedule 14.07.2016
comment
Terima kasih! ini bekerja dengan sangat baik. Saya hanya perlu mengganti MyRepo.update_all dengan Repo.update_all - person Adrian Ribao; 14.07.2016

Di Ecto 3, peluang untuk menggunakan return: true tidak digunakan lagi karena update_all dan mendukung pemilihan dalam kueri. Jadi, Anda akan menyelesaikannya seperti:

result = from(v in MyModel, where: v.id == ^instance_id, select: {v.id, v.counter})
         |> MyRepo.update_all([inc: [counter: 1]])
person Stoecki    schedule 16.01.2019