为什么唯一约束在Ecto中不起作用?

问题描述 投票:1回答:1

我的用户模型中有以下内容:

  def changeset(user, attrs) do
    user
    |> cast(attrs, [:login, :email])
    |> validate_required([:login, :email])
    |> unique_constraint(:login)
    |> unique_constraint(:email)
  end

但是仅以这种方式设置unique_contraint无效。测试控制器时,我仍然收到重复的登录名和电子邮件。

我完成了这项工作,但是我不得不在模型架构中将:unique关键字参数设置为true,并在迁移中为每列创建一个唯一索引。

除PostgreSQL唯一索引外,Ecto是否不检查约束本身?向unique_constraint函数添加changeset/2有什么意义吗?

postgresql elixir phoenix-framework ecto
1个回答
3
投票

唯一约束通过依赖数据库来检查是否违反了唯一约束,如果是,Ecto会将其转换为变更集错误。 — Ecto.Changeset.unique_constraint/3

也就是说,Ecto.Changeset.unique_constraint/3一直存在的原因是为了统一错误(使更改集错误与从DB接收到的错误无关。这显然可以简化错误并使之标准化)。>>

[unique_constraint/3显然不依靠DB本身无法检查约束。

© www.soinside.com 2019 - 2024. All rights reserved.