elixir - 添加一个唯一字段并填充它

标签 elixir database-migration phoenix-framework

我正在使用 Elixir 和 Phoenix,我有一个表,我想向该表添加一个新字段,但我希望该字段是唯一的。由于我的数据库在该表中已经有一堆寄存器,因此我想用表中另一个字段的值填充新字段。

例如,在它的帖子表中,我添加了新的字段名称,该名称将为 uniqe,并希望所有旧寄存器都使用电子邮件字段中的值填充字段名称。

我该怎么做?我在迁移中这样做吗?像:

def change do
  alter table(:posts) do
    add :name, :string, null: false, default: :email
  end

  create unique_index(:posts, [:name])
end

或者在模型中?

请为她提供一点帮助,我们将不胜感激。

最佳答案

您需要使用 Ecto 的 update_all 来执行此操作:

alias Myapp.Repo
alias Myapp.Post
import Ecto.Query

from(p in Post, update: [set: [name: p.old_name]])
|> Repo.update_all([])

成为您的旧字段的old_name,并为您想要旧值的字段命名。

请参阅 Ecto.Query 文档 https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3

关于elixir - 添加一个唯一字段并填充它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38233673/

相关文章:

elixir - Phoenix : How to supervise an Agent?

sockets - 配置 channel 测试超时 Phoenix

elixir - 在 Elixir 中设置现有结构值?

ruby-on-rails - Rails 迁移以添加索引到 2 列之间的差异

python - 使用Flask-SQLAlchemy,成功生成迁移脚本后,每次升级失败怎么办?

mysql - codeigniter迁移错误外键约束

ruby-on-rails - Phoenix Rails 的 'head :ok' 相当于什么?

elixir - 从 Ecto 模型中的非公共(public)模式中选择表

erlang - 首先放置最可能匹配的功能负责人是否有任何好处?

Elixir map 缩小