使一个领域独一无二
Making a field unique in ecto
如何在 ecto 中创建字段 unique
?
我以为它与Ruby中的活动记录相同,但似乎不是
您想使用 unique_constraint/3。这不像 Active Record,因为它使用数据库来确保唯一性。 Active Record 会查询具有相同值的记录,如果返回任何记录,那么它将失败。这有一个竞争条件,如果在提取以检查唯一性和插入记录之间插入一个值,您将最终得到重复数据或引发错误(取决于是否在数据库上设置了索引。 unique_constraint/3
没有这个竞争条件。
值得注意的一件事是,由于在尝试插入之前不知道唯一性,因此唯一性约束将在您的验证之后发生。无法同时显示验证和约束错误。
您使用的数据库也必须支持唯一约束。它们不适用于 SQLite。您可以在 GitHub issue.
上阅读更多内容
在您的迁移中:
create unique_index(:users, [:email])
那么在你的模型中:
cast(user, params, ~w(email), ~w())
|> unique_constraint(:email)
值得注意的是,Ecto 曾经提供一个 validate_unique/3
函数,该函数通过对数据库进行查询来工作,但是在 version 0.16.0[ 中,unique_constraint/3
被弃用了=18=]
如何在 ecto 中创建字段 unique
?
我以为它与Ruby中的活动记录相同,但似乎不是
您想使用 unique_constraint/3。这不像 Active Record,因为它使用数据库来确保唯一性。 Active Record 会查询具有相同值的记录,如果返回任何记录,那么它将失败。这有一个竞争条件,如果在提取以检查唯一性和插入记录之间插入一个值,您将最终得到重复数据或引发错误(取决于是否在数据库上设置了索引。 unique_constraint/3
没有这个竞争条件。
值得注意的一件事是,由于在尝试插入之前不知道唯一性,因此唯一性约束将在您的验证之后发生。无法同时显示验证和约束错误。
您使用的数据库也必须支持唯一约束。它们不适用于 SQLite。您可以在 GitHub issue.
上阅读更多内容在您的迁移中:
create unique_index(:users, [:email])
那么在你的模型中:
cast(user, params, ~w(email), ~w())
|> unique_constraint(:email)
值得注意的是,Ecto 曾经提供一个 validate_unique/3
函数,该函数通过对数据库进行查询来工作,但是在 version 0.16.0[ 中,unique_constraint/3
被弃用了=18=]