从具有id的struct的Ecto.Changeset中删除:id

时间:2016-09-26 15:52:52

标签: elixir ecto

我有一个简单的操作,它从数据库中检索文档,修改一个值,然后尝试将其重新插入为新文档。换句话说,我想复制数据库中已存在的文档。不出所料,此操作无法使用唯一的主键约束:

Ecto.ConstraintError:

constraint error when attempting to insert struct:
  * unique: docs_pkey

尝试使用id清除变更集中的put_change(doc, :id, null)会产生以下错误:

ERROR (not_null_violation): null value in column "id" violates not-null constraint

我想我需要做的是完全从变更集中删除id字段,但我在changeset documentation中找不到任何传统方式。

使用id之类的东西很容易剥离结构Map.put(doc, :id, nil),但对于我的特定应用,如果我可以从变更集中删除id会更好。

3 个答案:

答案 0 :(得分:1)

对于名为Upload的模式,我使用类似的代码执行类似操作,其中up​​load是我要复制的数据库中的项目。这对你有帮助吗?

changeset =
    upload
    |> Map.put(:id, nil)
    |> Upload.changeset(new_params)
    |> Repo.insert

答案 1 :(得分:1)

不确定这是否合适,以下是使用将changeset作为参数(不仅仅是struct)的方法构造重复变更集(对于模块from mysite.hpcAPI.serializers import CPUProjectsViewSet class CPUProjectsViewSet(viewsets.ViewSet): """ return all project name """ all_rows = connect_database() )的几个示例

Myapp.Doc

它仍会从def duplicate_changeset(changeset) do changeset.data |> Map.delete(:id) |> changeset end def duplicate_changeset(changeset) do changeset |> Map.put(:data, Map.delete(changeset.data, :id)) end def duplicate_changeset(changeset) do %{changeset | data: Map.delete(changeset.data, :id)} end

删除键:id

以下是测试:

changeset.data

答案 2 :(得分:0)

Ecto.Changeset#delete_change/2不会满足吗?

fullOuterJoin