如何在ecto中创建字段unique
?
我认为它与Ruby中的活动记录相同,但它似乎不是
答案 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