जहां तक मुझे पता है, कस्टम पोस्टग्रेएसक्यूएल की त्रुटियों को संभालने के लिए कोई अंतर्निहित तंत्र नहीं है। हालांकि, आप इसे रिपोजिटरी स्तर पर कर सकते हैं।
ऐसा करने के लिए, आपको ERRCODE
. का उपयोग करके PostgreSQL में त्रुटियों को उठाना होगा जैसे:
RAISE '[message for logs]' USING ERRCODE = 'integrity_constraint_violation';
और फिर उन्हें एप्लिकेशन में हैंडल करें:
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
{:error, %{changeset | valid?: false}}
जवाब। इसका मतलब है कि उस समय, प्रदर्शित करने के लिए कोई उपयोगी संदेश नहीं होगा।
पीएस आप शायद एक्टो के कार्यों को ओवरराइड करने के लिए कुछ मैक्रोज़ लिख सकते हैं और वहां कार्यान्वयन को छुपा सकते हैं (प्रस्तावित समाधान के बजाय) लेकिन मेरा मानना है कि इसे बनाए रखना बहुत कठिन होगा।