抢救Ecto.ConstraintError以保持迁移滚动?

时间:2018-03-06 02:11:20

标签: elixir phoenix-framework ecto

如何拯救Ecto.ConstraintError(由唯一性冲突引起 - 我对名为“field”的字符串属性有唯一索引)

以下是我的代码仍在提高错误并且似乎无法解救 - ecto.migration停止:

    try do
      Repo.insert(model_changeset, on_conflict: :nothing)
    rescue
      e -> IO.puts(inspect e)
    end

还有一点需要注意 - 有时model_changeset不是变更集而是结构 - 我应该总是传递变更集吗?我假设救援条款没关系 - 我应该能够按照我指定的方式解决任何一般错误。

编辑:

以下是相关的错误消息:

%Ecto.ConstraintError{constraint: "cars_field_index", message: "constraint error when attempting to insert struct:\n\n    * unique: claims_name_index\n\nIf you would like to convert this constraint into an error, please\ncall unique_constraint/3 in your changeset and define the proper\nconstraint name. The changeset has not defined any constraint.\n", type: :unique}
** (DBConnection.ConnectionError) transaction rolling back

1 个答案:

答案 0 :(得分:3)

为变更集unique_constraint / 3(https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3)添加唯一约束,它基本上将数据库错误转换为变更集错误。

然后你可以使用案例陈述。

case Repo.insert(model_changeset) do 
  {:ok, schema} -> schema 
  {:error, changeset} -> IO.inspect changeset
end