Skip to content

Commit ba8c2d4

Browse files
authored
Support other unique constraint error format (#115)
Unique constraints sometimes fail with the following error format: UNIQUE constraint failed: index '<index_name>' I believe this happens when the index name doesn't match the names of the columns involved. Example of an index for which this happens: CREATE UNIQUE INDEX test_user_id_number_year_index ON invoices (user_id, number, strftime('%Y', created_at));
1 parent eca01c1 commit ba8c2d4

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

lib/ecto/adapters/sqlite3/connection.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ defmodule Ecto.Adapters.SQLite3.Connection do
130130
end
131131

132132
@impl true
133+
def to_constraints(
134+
%Exqlite.Error{message: "UNIQUE constraint failed: index " <> constraint},
135+
_opts
136+
) do
137+
[unique: String.trim(constraint, ~s('))]
138+
end
139+
133140
def to_constraints(
134141
%Exqlite.Error{message: "UNIQUE constraint failed: " <> constraint},
135142
_opts

test/ecto/adapters/sqlite3/connection_test.exs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2414,6 +2414,40 @@ defmodule Ecto.Adapters.SQLite3.ConnectionTest do
24142414
assert execute_ddl(integer) == [~s/CREATE TABLE "posts" ("id" INTEGER PRIMARY KEY)/]
24152415
end
24162416

2417+
describe "to_constraints/2" do
2418+
alias Ecto.Adapters.SQLite3.Connection
2419+
2420+
test "unique index" do
2421+
# created with:
2422+
# CREATE UNIQUE INDEX users_email_name_index ON users (email);
2423+
2424+
error = %Exqlite.Error{message: "UNIQUE constraint failed: users.email"}
2425+
assert Connection.to_constraints(error, []) == [unique: "users_email_index"]
2426+
end
2427+
2428+
test "multi-column unique index" do
2429+
# created with:
2430+
# CREATE UNIQUE INDEX users_email_name_index ON users (email, name);
2431+
2432+
error = %Exqlite.Error{
2433+
message: "UNIQUE constraint failed: users.email, users.name"
2434+
}
2435+
2436+
assert Connection.to_constraints(error, []) == [unique: "users_email_name_index"]
2437+
end
2438+
2439+
test "complex unique index" do
2440+
# created with:
2441+
# CREATE UNIQUE INDEX users_email_year_index ON users (email, strftime('%Y', inserted_at));
2442+
2443+
error = %Exqlite.Error{
2444+
message: "UNIQUE constraint failed: index 'users_email_year_index'"
2445+
}
2446+
2447+
assert Connection.to_constraints(error, []) == [unique: "users_email_year_index"]
2448+
end
2449+
end
2450+
24172451
defp remove_newlines(string) do
24182452
string |> String.trim() |> String.replace("\n", " ")
24192453
end

0 commit comments

Comments
 (0)