2015-04-11 1 views
7

Come altre funzioni in elixir (come pure le transazioni proprie di Ecto), voglio eseguire lo schema di corrispondenza per gestire potenziali errori con le query Ecto. Come questo:Come associare l'errore di query Ecto

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

Ovviamente questo non funziona, ma come faccio a modello gli errori partita Ecto come Ecto.NotSingleResult e altri potenziali problemi di query come gli errori di precarico?

risposta

2

Usa Repo.get che restituirà un valore o nullo. È quindi possibile modellare la corrispondenza sulla struttura prevista o utilizzare le clausole if. Repo.get! si alza di proposito (per i casi in cui ci si aspetta che una struttura sia lì e che non ci sia un errore).

+2

Sì, questo è il modo in cui lo sto facendo ora, mi stavo chiedendo perché Ecto non ha restituito una tupla come molte altre cose. La risposta alla tupla è un modo davvero carino per gestire gli errori e il flusso. –

+0

L'elisir ha davvero entrambi. Solitamente utilizziamo la tupla quando ci sono diverse ragioni per l'errore (come nelle funzioni del modulo File). Qui, tuttavia, l'unica ragione di errore è l'assenza di un valore che è correttamente espresso con zero. –

+0

Un ulteriore motivo per un errore nelle query Ecto è quando la funzione prevede al massimo un risultato, ma invece i risultati vengono estratti dalla query. Quindi abbiamo due diversi motivi per un errore e due diversi modi per gestirli: zero quando non si ottiene alcun risultato e un'eccezione quando si ottengono più risultati. Con le tuple sarebbe facile ed elegante gestire questi casi perché potremmo usare le istruzioni "case" o "con", specialmente quando più query Ecto sono concatenate. – Guido

0

Hey io sono un pò di nuovo da elisir, ma penso che si potrebbe utilizzare la clausola di guardia qui

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

Il problema è che Ecto.Repo.whatever non restituisce una tupla come {: ok, ok} o {: errore, errore} e non corrisponde a nessuna clausola caso. L'ho ora in una funzione privata fondamentalmente facendo un '[Repo.get()] |> List.count()' e corrispondenti nil a: errore e 1 a: ok, ma ho pensato che ci potrebbe essere n modo più semplice. –