打造 ecto 独一无二的领域

2024-04-15

如何制作一个字段unique在体外?

我以为它和Ruby中的活动记录一样,但似乎不是


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

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

The database you are using must support unique constraints too. They won't work with SQLite. You can read more on the [GitHub issue]https://github.com/elixir-lang/ecto/issues/865 https://github.com/elixir-lang/ecto/issues/865).

使用 SQLite3 数据库时,您只需使用ecto3_sqlite3适配器,并且唯一约束将按预期工作。

添加到您的mix.exs:

{:ecto_sqlite3, "~> 0.7.7"},

在您的迁移中:

create unique_index(:users, [:email])

然后在你的模型中:

cast(user, params, ~w(email), ~w())
|> unique_constraint(:email)

值得注意的是,Ecto 曾经提供validate_unique/3通过对数据库进行查询来工作的函数,但它已被弃用unique_constraint/3 In 版本0.16.0 https://github.com/elixir-lang/ecto/releases/tag/v0.16.0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打造 ecto 独一无二的领域 的相关文章

  • 如何在启动 iex 会话时执行一些命令?

    假设我想在项目的根路径中启动 iex 时实现一些命令 例如 Logger configure level info require Ecto Query alias MyApp User and so on 我想在每次启动 iex 时自动执
  • 如何测试 Phoenix 套接字是否已终止?

    我正在寻找一种方法来测试套接字是否被终止 被测试的代码执行以下操作 def handle in logout payload socket do stop logout socket gt assign user nil end 和我的测试
  • 基于结构类型更改的分块列表

    我有一个列表 我想根据从结构类型 B 到 A 的转换来分块 例如 我有以下内容 iex 1 gt defmodule A do defstruct module A iex 2 gt defmodule B do defstruct mod
  • 在 Elixir 中部署时更改后端/模块?

    如何实现一个可替换的后端 或基本上任何部分或模块 以便可以在 Elixir 中的配置 部署时进行替换 我的具体情况是一个简单的网络应用程序 在本例中使用 Phoenix 但我猜这个问题也适用于其他情况 我有一个非常简单的后端 使用Agent
  • 为什么 Supervisor.start_child 不起作用

    我是 Elixir 的初学者 我有一个应用程序在 application ex 中启动一个自定义主管 代码 defmodule MyApp do use Application def start type args do import S
  • “!”、“?”、“_”和“.”是什么意思? Elixir 中的语法

    我需要帮助理解 Elixir 中的以下语法 and 这些语法在 Elixir 的功能中起什么作用 例如Repo get 我不确定它们是否只是函数名称 或者有一个角色 虽然我知道 用于调用匿名函数 和 对于任何或可变的 失败时引发异常的函数约
  • 当您在地图上进行操作时,Elixir 中是否会保留键和值的顺序?

    假设我在 Elixir 中有一张地图 m a gt 1 b gt 2 c gt 3 如果我打电话Map values m 我能保证返回值永远是 1 2 3 按这个顺序而不是说 3 1 2 这是我从文档中不清楚的一件事 经过一些初步测试 我认
  • Ecto 模型 - select 中的子查询

    我需要使用 Ecto 进行 SQL 查询 SELECT users select count 0 from money transactions where from id users id AND created at gt 2016 1
  • Ecto 和 Elixir 的默认日期时间

    我今天刚刚开始使用 Elixir 和 Phoenix 我正在尝试添加 Ecto 作为映射器 但我在使用时间时遇到了一些问题 这是我的模型 schema users do field name string field email strin
  • 仅针对使用通道而定制的 Phoenix 应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?

    我将节点应用程序纯粹用于带有 Redis PubSub 的 socket io 通道 目前我将其分布在 3 台机器上 并由其中一台机器上的 nginx 负载平衡提供支持 我想用 Phoenix 应用程序替换这个节点应用程序 而且我对 erl
  • Elixir 中的递归和匿名函数

    我正在尝试定义一个匿名函数来执行点积 我可以将其编码为私有函数 没有任何问题 但我正在努力解决匿名函数语法 我知道我可以以不同的方式实现这一点 但我试图了解如何使用模式匹配和递归来定义匿名函数 这是我当前的实现 dot fn i input
  • 如何在phoenix中使用session连接?

    我有一个身份验证插头 我想测试我的控制器 问题是这个插头里的线有 user id get session conn user id 当我使用这种方法时它总是为零 我以前使用过dirty hack 但我不再想这样做 session Plug
  • GenServer 正常关闭

    我使用 GenServer 编写了一个 Elixir 应用程序 该应用程序在启动时启动外部应用程序 然后将其关闭 并在退出时进行其他清理 我在中添加了启动功能init 1 https hexdocs pm elixir GenServer
  • 如何在 Elixir 或 Phoenix 框架中安排代码每隔几个小时运行一次?

    假设我想每 4 小时发送一堆电子邮件或重新创建站点地图或其他任何内容 我该如何在 Phoenix 或仅使用 Elixir 做到这一点 有一个简单的替代方案 不需要任何外部依赖项 defmodule MyApp Periodically do
  • Phoenix 中的 web/static 和 priv/static 有什么区别?

    我对长生不老药和凤凰是新手 现在我在凤凰城的静态资产方面遇到了麻烦 我想在我的页面中添加一个js文件 我在我的模板中添加以下代码 js test js gt gt 然后创建一个js文件web static js test js 但是 我收到
  • 创建新的保护子句

    在 Elixir 中 我将如何为函数创建新的保护子句 显然 我已经看到你不能只调用 a 中的任何函数when声明 但如果能够做这样的事情那就太好了 defmodule Player do def play card player do de
  • Elixir Ecto:模式中的多个belongs_to关系

    我有以下架构 defmodule Message do use Ecto Schema schema messages do belongs to user FPL Club foreign key user to id belongs t
  • 如何在简单的 Elixir 脚本中加载 Elixir 库?

    在 ruby 脚本中 我可以简单地执行以下操作 require some gem SomeGem do something 我怎样才能在 Elixir 中做类似的事情exs脚本而不创建一个全新的混合项目 到目前为止 我已经在谷歌上搜索了执行
  • 将新元素添加到列表中

    我试图将一个新元素添加到列表中 如下所示 iex 8 gt l 3 5 7 7 8 3 3 5 7 7 8 3 iex 9 gt l 3 5 7 7 8 3 为什么我会排在第五位 8 3 它是什么意思 如何将新元素添加到列表中 Update
  • Elixir assert_raise 无法捕获异常

    我写了这个测试用例 assert raise ArgumentError myFn a b 但它并没有按照我期望的方式进行评估 myFn引发一个 ArgumentError do raise ArgumentError 但它没有被捕获ass

随机推荐