2015-04-11 5 views
7

Wie andere Funktionen in Elixier (sowie Ectos eigenen Transaktionen), möchte ich Muster zu behandeln, um mögliche Fehler mit Ecto-Abfragen zu behandeln. Wie folgt aus:Wie Muster Match Ecto Query Fehler

case Repo.get!(User, id) do 
    {:ok, user} -> 
    #do something 
    {:error, message} -> 
    #pass the error 
end 

Offensichtlich funktioniert das nicht, aber wie kann ich Muster Spiel Ecto Fehler wie Ecto.NotSingleResult und andere mögliche Abfrage Probleme wie Vorbelastung Fehler?

Antwort

2

Gebrauch verwenden könnte Repo.get, die einen Wert oder Null zurück. Sie können dann eine Musterübereinstimmung für die erwartete Struktur erstellen oder if-Klauseln verwenden. Repo.get! wird absichtlich ausgelöst (für die Fälle, in denen Sie erwarten, dass eine Struktur vorhanden ist und nicht dort ist, liegt ein Fehler vor).

+2

Ja, das ist irgendwie so, wie ich es jetzt mache, ich habe mich nur gewundert, warum Ecto kein Tupel zurückgegeben hat wie viele andere Dinge. Die Tupel-Antwort ist eine wirklich nette Art, mit Fehlern und Flows umzugehen. –

+0

Elixier hat tatsächlich beides. Wir verwenden das Tupel normalerweise, wenn es verschiedene Gründe für Fehler gibt (wie in den Funktionen im Dateimodul). Hier ist jedoch der einzige Grund für den Fehler das Fehlen eines Wertes, der richtig mit Null ausgedrückt wird. –

+0

Ein weiterer Grund für einen Fehler in Ecto-Abfragen ist, wenn die Funktion höchstens ein Ergebnis erwartet, sondern mehrere Ergebnisse von der Abfrage extrahiert werden. Wir haben also zwei verschiedene Gründe für einen Fehler und zwei verschiedene Arten, sie zu behandeln: null, wenn wir überhaupt kein Ergebnis erhalten, und eine Ausnahme, wenn wir mehrere Ergebnisse erhalten. Mit Tupeln wäre es einfach und elegant, diese Fälle zu behandeln, da wir die "case" - oder "with" -Anweisungen verwenden könnten, insbesondere wenn mehrere Ecto-Abfragen miteinander verkettet sind. – Guido

0

Hey ich bin irgendwie neu zu Elixier aber ich denke, Sie die Schutzklausel hier

case Repo.get!(User, id) do 
    {:ok, user} -> 
    #do something 
    {:error, message} when :error === Ecto.NotSingleResult -> 
    #pass the error 
end 
+0

Das Problem ist nicht, dass Ecto.Repo.whatever ein Tupel wie nicht zurück {: ok, ok} oder {: Fehler, Fehler} und es passt nicht zu beiden Fallklauseln. Ich habe es jetzt in einer privaten Funktion im Grunde eine '[Repo.get()] |> List.count()' und passender Nil zu: Fehler und 1 zu: ok, aber ich dachte, es könnte n einfacher Weg. –