我有一个简单的操作,它从数据库中检索文档,修改一个值,然后尝试将其重新插入为新文档。换句话说,我想复制数据库中已存在的文档。不出所料,此操作无法使用唯一的主键约束:
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
会更好。
答案 0 :(得分:1)
对于名为Upload
的模式,我使用类似的代码执行类似操作,其中upload是我要复制的数据库中的项目。这对你有帮助吗?
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