我有一个简单的审核表:
schema "table" do
field :unique_field, :string
field :from_date, :naive_datetime
field :to_date, :naive_datetime
timestamps()
end
unique_field
具有唯一的索引约束。
插入新条目时,如果发生冲突,如果新条目的from_date
比当前条目旧,那么我想更新日期,否则保留旧日期。
当并行添加大量条目时,这必须起作用,这意味着应使用Repo.insert
和:on_conflict
的组合。
答案 0 :(得分:0)
您应该能够将Ecto.Query
作为on_conflict
的值。 in the Ecto documentation对此有更多描述。
没有测试它,但是类似的东西应该可以工作:
unique_value = 123 # Just as an example
new_from_date = ~D[2020-06-16] # Just as an example
update_query =
from(t in "table",
where: t.unique_field == ^unique_value,
where: t.from_date < ^new_from_date,
update: [set: [from_date: ^new_from_date]]
)
Repo.insert(..., on_conflict: update_query, conflict_target: :unique_field)