迁移以更改引用列上的 on_delete 选项
Migration for changing on_delete option on references column
我和 Phoenix 一起玩,并建立了 has_many 联想。我通常将 on_delete: :delete_all
作为参考列的选项。但是,如果我改变主意并想稍后为 nilify_all
更改它,有没有办法通过内部迁移来解决这个问题?
创建 table 的迁移:
def change do
create table(:messages) do
add :body, :text
add :sender_id, references(:users, on_delete: :delete_all)
timestamps()
end
create index(:messages, [:sender_id])
end
我正在寻找这样的东西:
def change do
change_options table(:messages), :user_id, on_delete: :nilify_all
end
您可以为此使用 modify
,在新的 type
中传递新的 on_delete
选项,但我在尝试此操作时遇到 this bug,修复就是先手动DROP
约束。您还需要指定 up
和 down
版本,因为 modify
是不可逆的。
def up do
execute "ALTER TABLE posts DROP CONSTRAINT posts_user_id_fkey"
alter table(:posts) do
modify(:user_id, references(:users, on_delete: :delete_all))
end
end
def down do
execute "ALTER TABLE posts DROP CONSTRAINT posts_user_id_fkey"
alter table(:posts) do
modify(:user_id, references(:users, on_delete: :nothing))
end
end
This Elixir Forum post 注意到 modify()
可以采用 :from
选项;这让您可以使用 change
而不是 up
/down
,它会为您删除之前的约束:
def change do
alter table(:messages) do
modify :sender_id, references(:users, on_delete: :nilify_all),
from: references(:users, on_delete: :delete_all)
end
end
我和 Phoenix 一起玩,并建立了 has_many 联想。我通常将 on_delete: :delete_all
作为参考列的选项。但是,如果我改变主意并想稍后为 nilify_all
更改它,有没有办法通过内部迁移来解决这个问题?
创建 table 的迁移:
def change do
create table(:messages) do
add :body, :text
add :sender_id, references(:users, on_delete: :delete_all)
timestamps()
end
create index(:messages, [:sender_id])
end
我正在寻找这样的东西:
def change do
change_options table(:messages), :user_id, on_delete: :nilify_all
end
您可以为此使用 modify
,在新的 type
中传递新的 on_delete
选项,但我在尝试此操作时遇到 this bug,修复就是先手动DROP
约束。您还需要指定 up
和 down
版本,因为 modify
是不可逆的。
def up do
execute "ALTER TABLE posts DROP CONSTRAINT posts_user_id_fkey"
alter table(:posts) do
modify(:user_id, references(:users, on_delete: :delete_all))
end
end
def down do
execute "ALTER TABLE posts DROP CONSTRAINT posts_user_id_fkey"
alter table(:posts) do
modify(:user_id, references(:users, on_delete: :nothing))
end
end
This Elixir Forum post 注意到 modify()
可以采用 :from
选项;这让您可以使用 change
而不是 up
/down
,它会为您删除之前的约束:
def change do
alter table(:messages) do
modify :sender_id, references(:users, on_delete: :nilify_all),
from: references(:users, on_delete: :delete_all)
end
end