Elixir Repo.insert_all/2和唯一约束

Elixir Repo.insert_all/2和唯一约束,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我今天有一个相当有趣的问题。我正试图使用EXTO函数Repo.insert_all/2将CSV文件批量插入到我的数据库中。然而,有一件事困扰着我 在我的上下文中,问题在于以下代码: defmodule AppName.Roles do def bulk_insert(array_of_maps) do try do Repo.insert_all(Role, array_of_maps) rescue exception in Postgrex.Er

我今天有一个相当有趣的问题。我正试图使用EXTO函数
Repo.insert_all/2
将CSV文件批量插入到我的数据库中。然而,有一件事困扰着我

在我的上下文中,问题在于以下代码:

defmodule AppName.Roles do
  def bulk_insert(array_of_maps) do
    try do 
      Repo.insert_all(Role, array_of_maps)
    rescue
      exception in Postgrex.Error ->
        _handle_exception(exception) # or whatever
    end
  end
end 
但就目前而言,这似乎是一种黑客行为。因为我知道有一个内置的变更集机制,可以处理唯一的约束,但我不知道如何将系统的这一部分包含在
Repo.insert_all/3

但是由于
insert_all
函数不关心变更集,这使得这一点更加困难

(我当然是指
唯一约束/2

我知道我可以:

  • 使用
    Multi
    执行此操作,但这会在后端创建单独的查询,而不是将其作为一个大查询执行

  • 使用
    try rescue
    块保存代码,但我想看看是否有更灵丹妙药的方法来解决这个问题,因为模式匹配的原理,让它崩溃

    • 接受选项列表,其中一个选项是

      • :on_conflict
        -它可能是
        :raise
        (默认值),
        :nothing
        :replace_all
        :replace_all_,除了主键
        {:replace,fields}
        ,更新指令的关键字列表或更新查询
      通常,无论您是否希望处理冲突,他们都会将该选项设置为有帮助的选项,而不是引发异常

      另外,
      :冲突\u目标
      选项可能用于提供不安全的片段