添加一个唯一的字段并填充它

时间:2016-07-06 20:58:39

标签: elixir database-migration phoenix-framework

我正在与Elixir和Phoenix合作,我有一张桌子,我想在这张桌子上添加一个新字段,但我希望这个字段是唯一的。由于我的DataBase在这个表中已经有一堆寄存器,我想用表中另一个字段的值填充新字段。

例如,它发布的表格,我添加了新的字段名称,这将是唯一的,并希望所有旧的寄存器用字段电子邮件中的值填充字段名称。

我该怎么做?我是否在迁移中执行此操作?像:

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

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

还是在模特中?

请给她一点帮助,非常感谢。

1 个答案:

答案 0 :(得分:5)

您需要使用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 docs https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3