在ecto中创建一个独特的字段

时间:2015-09-08 14:50:35

标签: elixir ecto

如何在ecto中创建字段unique

我认为它与Ruby中的活动记录相同,但它似乎不是

1 个答案:

答案 0 :(得分:64)

您想使用unique_constraint/3。这与Active Record不同,因为它使用数据库来确保唯一性。 Active Record会对具有相同值的记录进行查询,如果有任何返回,则会失败。这有一个竞争条件,如果在提取以检查唯一性和插入记录之间插入一个值,您将最终得到重复数据或引发错误(取决于是否在数据库上设置了索引。{ {1}}没有这种竞争条件。

值得注意的是,由于在尝试插入之前不知道唯一性,因此在验证之后将发生唯一约束。无法同时显示验证错误和约束错误。

您使用的数据库也必须支持唯一约束。他们不会使用SQLite。您可以在GitHub issue上了解更多信息。

在您的迁移中:

unique_constraint/3

然后在你的模型中:

create unique_index(:users, [:email])

值得注意的是,Ecto曾经提供cast(user, params, ~w(email), ~w()) |> unique_constraint(:email) 函数,该函数通过对数据库进行查询而工作,但是在version 0.16.0