วิธีใช้แฟรกเมนต์เพื่อส่งคืนค่าเมื่ออัปเดตใน Ecto

ฉันต้องทำการอัปเดตในฐานข้อมูลและส่งกลับค่า ซึ่งสามารถทำได้โดยใช้คีย์เวิร์ด RETURNING ใน PostgreSQL

เนื่องจากสิ่งนี้ไม่รองรับโดย ecto ฉันเดาว่าฉันต้องใช้ แฟรกเมนต์แต่ฉันไม่แน่ใจว่าต้องทำอย่างไร นี่คือสิ่งที่ฉันมี:

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

ฉันต้องการส่งคืนบางฟิลด์หลังจากอัปเดต เช่น ตัวนับและรหัส ดังนั้นฉันจึงต้องเพิ่มลงในแบบสอบถาม: RETURNING id, counter;


person Adrian Ribao    schedule 14.07.2016    source แหล่งที่มา


คำตอบ (2)


หากคุณใช้ Ecto.Repo.update_all https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3 มีตัวเลือก :returning to pass พร้อมกับรายการฟิลด์ที่ส่งคืน

:returning - เลือกฟิลด์ที่จะส่งคืน เมื่อเป็นจริง จะส่งคืนฟิลด์ทั้งหมดในโครงสร้างที่กำหนด อาจเป็นรายการฟิลด์ที่ยังคงส่งคืนโครงสร้างแต่เฉพาะกับฟิลด์ที่กำหนดเท่านั้น หรือเท็จ โดยที่ไม่มีการส่งคืนสิ่งใดเลย (ค่าเริ่มต้น) ตัวเลือกนี้ไม่ได้รับการสนับสนุนในฐานข้อมูลทั้งหมด

และหลังจากดำเนินการแล้ว คุณสามารถเข้าถึง tuple ได้ดังนี้:

มันจะส่งคืนสิ่งอันดับที่มีจำนวนของรายการและผลลัพธ์ใด ๆ ที่ส่งคืนเป็นองค์ประกอบที่สอง หากฐานข้อมูลไม่รองรับคำสั่ง RETURNING ใน UPDATE หรือไม่ได้เลือกผลลัพธ์การส่งคืน องค์ประกอบที่สองจะเป็นศูนย์

บางสิ่งเช่นนี้:

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
ขอบคุณ! มันใช้งานได้ดีอย่างสมบูรณ์แบบ ฉันแค่ต้องแทนที่ MyRepo.update_all ด้วย Repo.update_all - person Adrian Ribao; 14.07.2016

ใน Ecto 3 โอกาสในการใช้ return: true เลิกใช้แล้วสำหรับ update_all เพื่อสนับสนุนการเลือกในแบบสอบถาม ดังนั้นคุณจะแก้มันได้เช่น:

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