2016-07-14 8 views
0

Ich muss eine Aktualisierung in der Datenbank durchführen und einen Wert zurückgeben. Dies ist möglich, mit dem RETURNING Schlüsselwort in PostgreSQLSo verwenden Sie Fragment für die Rückgabe eines Werts beim Aktualisieren in Ecto

Da dies nicht von Ecto unterstützte Ich glaube, ich habe ein fragment verwenden, aber ich bin nicht sicher, wie das zu tun. Das ist, was ich habe:

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

Ich mag einige Felder zurück nach der Aktualisierung, zum Beispiel der Zähler und die ID, also würde ich brauchen, um die Abfrage hinzuzufügen: RETURNING id, counter;

Antwort

1

Wenn Sie Ecto.Repo.update_allhttps://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3 verwenden gibt es eine Option: Rückkehr mit der Rückkehr Liste der Felder passieren

: Rückkehr - wählt aus, welche zurückzukehren Felder. Wenn "true", werden alle Felder in der angegebenen Struktur zurückgegeben. Kann eine Liste von Feldern sein, in denen eine Struktur immer noch zurückgegeben wird, aber nur mit den angegebenen Feldern. Oder falsch, wenn nichts zurückgegeben wird (Standard). Diese Option wird nicht von allen Datenbanken unterstützt.

Und nach der Ausführung Du ein Tupel mit diesem zugreifen:

Es gibt ein Tupel enthält die Anzahl der Einträge und jedes zurückgegebene Ergebnis als zweites Element. Wenn die Datenbank RETURNING in UPDATE-Anweisungen nicht unterstützt oder kein Rückgabeergebnis ausgewählt wurde, ist das zweite Element nil.

Etwas wie folgt aus:

result = from(v in MyModel, where: v.id == ^instance_id) 
     |> MyRepo.update_all([inc: [counter: 1]], returning: [id, counter]) 
+0

Thank you! das funktioniert ganz gut. Ich musste 'MyRepo.update_all' nur durch' Repo.update_all' ersetzen –