PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara meningkatkan kesalahan Postgresql khusus dan menanganinya di Ecto

Sejauh yang saya tahu, tidak ada mekanisme bawaan untuk menangani kesalahan PostgreSQL khusus. Namun, Anda dapat melakukannya di tingkat repositori.

Untuk melakukan itu, Anda harus memunculkan kesalahan di PostgreSQL menggunakan ERRCODE seperti:

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

lalu tangani di aplikasi:

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

Perhatikan {:error, %{changeset | valid?: false}} tanggapan. Artinya, pada saat itu, tidak akan ada pesan yang berguna untuk ditampilkan.

PS Anda mungkin bisa menulis beberapa makro untuk menimpa fungsi Ecto dan menyembunyikan implementasinya di sana (bukan solusi yang diusulkan) tapi saya yakin akan jauh lebih sulit untuk mempertahankannya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pencadangan Inkremental PostgreSQL dan Pemulihan Point-In-Time

  2. Apakah ada jalan pintas untuk menggunakan dblink di Postgres?

  3. Bagaimana cara menentukan hari terakhir bulan sebelumnya menggunakan PostgreSQL?

  4. perhitungan persentil ke-n di postgresql

  5. Mengapa sebaiknya menyimpan nomor telepon sebagai string vs. integer?