【问题标题】:Why is unique contraint not working in Ecto?为什么唯一约束在 Ecto 中不起作用?
【发布时间】:2020-04-03 23:51:20
【问题描述】:

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

  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 是否不检查约束本身?在changeset/2 函数中添加unique_constraint 有什么意义吗?

【问题讨论】:

    标签: postgresql elixir phoenix-framework ecto


    【解决方案1】:

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

    也就是说,unique_constraint/3 存在的原因是为了统一错误(从从数据库接收到的内容中生成变更集错误。)这显然简化并标准化了错误处理。

    Ecto 显然无法自行检查约束,不依赖 DB。

    【讨论】:

    • Ecto 显然无法在不依赖 DB 的情况下自行检查约束。 Ruby on Rails 进行选择只是为了检查唯一验证,而不依赖于 DB 服务器错误.
    • 我不确定我是否遵循。您是否期望 RoR 在本地下载 10TB 数据库以在本地验证值的唯一性?我怀疑它确实如此,即使它会如此railish
    • 在 Ruby on Rails 中,当您设置唯一约束时,它会触发 SQL SELECT 来检查唯一约束本身。 Ecto 不提供此功能。
    • 不需要下载数据,select只是一个count()。
    • 其实我更喜欢Ecto方式=)
    猜你喜欢
    • 2017-03-26
    • 2013-01-18
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多