Thanks @dimitarvp and @LostKobrakai, here’s what I ended up settling on:
defmodule Database.Repo.Migrations.StringToListMigration do
use Ecto.Migration
def change do
execute(&string_to_list/0, &list_to_string/0)
end
defp string_to_list() do
repo().query!("alter table my_table alter column_name type varchar(255)[] using array[column_name], alter column_name set default '{}';", [], [log: :info])
end
defp list_to_string() do
repo().query!("alter table my_table alter column_name type varchar(255) using column_name[1], alter column_name drop default;", [], [log: :info])
end
end
I do the renaming / other cleanup operations in a separate migration.






















