2017-05-09 2 views
0

j'ai une base de données existante et il y a un index unique dans ce tableauL'utilisation Ecto dans Elixir, cela ne peut pas évaluer le contrant unique pour un index existant

ALTER TABLE ONLY users ADD CONSTRAINT unique_document_id UNIQUE (document_id); 

Je n'ai pas de migration dans Ecto, et Je veux insérer un nouvel enregistrement en utilisant un changeset. Voici le code du modèle et le code à insérer

defmodule User do 
    use Ecto.Schema 

    schema "users" do 
    field :name 
    field :email 
    field :document_id 
    end 

    def signup(name, id_number, email) do 
    changeset = User.changeset(%User{}, %{name: name, 
              email: email, 
              document_id: id_number}) 

    if changeset.valid? do 
     IO.inspect "the chagenset is valid" 
     user = case Repo.insert(changeset) do 
     {:ok, model}  -> {:ok, model } 
     {:error, changeset} -> {:error, changeset.errors} 
     end 
    end 


def changeset(driver, params \\ :empty) do 
    driver 
    |> cast(params, [:document_id, :email, :name]) 
    |> validate_required([:document_id, :email, :name]) 
    |> unique_constraint(:document_id) 
    |> unique_constraint(:email) 
    end 


    end 

end 

Mais lorsque je tente d'insérer un utilisateur dupliquée je reçois cette erreur et changeset.valid? est vrai

11:04:17.896 [error] #PID<0.434.0> running App terminated 
Server: localhost:4000 (http) 
Request: POST /api/signup 
** (exit) an exception was raised: 
    ** (Ecto.ConstraintError) constraint error when attempting to insert struct: 

    * unique: unique_document_id 

If you would like to convert this constraint into an error, please 
call unique_constraint/3 in your changeset and define the proper 
constraint name. The changeset defined the following constraints: 

    * unique: users_document_id_index 

     (ecto) lib/ecto/repo/schema.ex:493: anonymous fn/4 in Ecto.Repo.Schema.constraints_to_errors/3 
     (elixir) lib/enum.ex:1229: Enum."-map/2-lists^map/1-0-"/2 
     (ecto) lib/ecto/repo/schema.ex:479: Ecto.Repo.Schema.constraints_to_errors/3 
     (ecto) lib/ecto/repo/schema.ex:213: anonymous fn/13 in Ecto.Repo.Schema.do_insert/4 
     (ecto) lib/ecto/repo/schema.ex:684: anonymous fn/3 in Ecto.Repo.Schema.wrap_in_transaction/6 
     (ecto) lib/ecto/adapters/sql.ex:620: anonymous fn/3 in Ecto.Adapters.SQL.do_transaction/3 
     (db_connection) lib/db_connection.ex:1275: DBConnection.transaction_run/4 
     (db_connection) lib/db_connection.ex:1199: DBConnection.run_begin/3 

Répondre

3

Vous devez spécifier le nom de contrainte dans l'appel à unique_constraint puisque ce n'est pas la convention par défaut Ecto (ce qui serait users_document_id_index, comme le message d'erreur indique):

|> unique_constraint(:document_id, name: :unique_document_id) 

Si vous avoir un nom de contrainte unique pour l'e-mail qui n'est pas users_name_index, vous devrez également faire la même chose pour unique_constraint(:name).