PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zgłosić niestandardowy błąd Postgresql i obsłużyć go w Ecto?

O ile mi wiadomo, nie ma wbudowanego mechanizmu obsługi niestandardowych błędów PostgreSQL. Możesz to jednak zrobić na poziomie repozytorium.

Aby to zrobić, musisz zgłosić błędy w PostgreSQL za pomocą ERRCODE jak:

RAISE '[message for logs]' USING ERRCODE = 'integrity_constraint_violation';

a następnie obsłuż je w aplikacji:

defmodule Core.Repo do
  use Ecto.Repo, otp_app: :core

  defoverridable insert: 2

  def insert(changeset, opts) do
    super(changeset, opts)
  rescue
    exception in Postgrex.Error ->
      handle_postgrex_exception(exception, __STACKTRACE__, changeset)
  end

  # ... other functions

  defp handle_postgrex_exception(exception, stacktrace, changeset \\ nil)

  defp handle_postgrex_exception(%{postgres: %{code: :integrity_constraint_violation}}, _, nil) do
    {:error, :integrity_constraint_violation}
  end

  defp handle_postgrex_exception(
         %{postgres: %{code: :integrity_constraint_violation}},
         _,
         changeset
       ) do
    {:error, %{changeset | valid?: false}}
  end

  defp handle_postgrex_exception(exception, stacktrace, _) do
    reraise(exception, stacktrace)
  end
end

Zwróć uwagę na {:error, %{changeset | valid?: false}} odpowiedź. Oznacza to, że w tym momencie nie będzie żadnej użytecznej wiadomości do wyświetlenia.

PS prawdopodobnie mógłbyś napisać kilka makr, aby przesłonić funkcje Ecto i ukryć tam implementację (zamiast proponowanego rozwiązania), ale uważam, że byłoby to znacznie trudniejsze w utrzymaniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. urlencode tylko z wbudowanymi funkcjami

  2. Postgresql:Grupowanie z limitem rozmiaru grupy przy użyciu funkcji okna

  3. PostgreSQL z problemem własności dockera

  4. Połączenie łańcuchowe nie filtruje zgodnie z oczekiwaniami

  5. Jak porównywać wydajność PostgreSQL