sql >> Databáze >  >> RDS >> PostgreSQL

Jak vyvolat vlastní chybu Postgresql a zpracovat ji v Ecto

Pokud vím, neexistuje žádný vestavěný mechanismus pro zpracování vlastních chyb PostgreSQL. Můžete to však udělat na úrovni úložiště.

Chcete-li to provést, musíte vyvolat chyby v PostgreSQL pomocí ERRCODE jako:

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

a pak je zpracujte v aplikaci:

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

Všimněte si {:error, %{changeset | valid?: false}} Odezva. To znamená, že v tomto okamžiku nebude žádná užitečná zpráva k zobrazení.

PS:Pravděpodobně byste mohli napsat nějaká makra, která přepíší funkce Ecto a skryjí implementaci tam (místo navrhovaného řešení), ale věřím, že by to bylo mnohem těžší udržovat.



  1. Brána PL/SQL v R11i

  2. GAE Python – Žádný modul s názvem MySQLdb

  3. Problém s aktualizací entity pomocí jpa/hibernate

  4. Načítání dat RDF do tabulky PostgreSQL pomocí RDFLib-SQLAlchemy