Loading...
Loading...
Set up database migrations for Elixir releases. Use when asked to configure release migrations, add migrate command to releases, or set up Ecto for production deployment without Mix.
npx skill4agent add gsmlg-dev/code-agent ecto-release-migrationsbin/app_name evalmix.exsconfig/config.exsconfig/runtime.exslib/<app_name>/release.exconfig/runtime.exsDATABASE_URLdefmodule <AppName>.Release do
@moduledoc """
Release tasks for database management.
Usage in production:
bin/<app_name> eval "<AppName>.Release.migrate()"
bin/<app_name> eval "<AppName>.Release.rollback(<AppName>.Repo, 20240101000000)"
"""
@app :<app_name>
def migrate do
load_app()
for repo <- repos() do
{:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true))
end
end
def rollback(repo, version) do
load_app()
{:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :down, to: version))
end
def create do
load_app()
for repo <- repos() do
case repo.__adapter__().storage_up(repo.config()) do
:ok -> IO.puts("Database created for #{inspect(repo)}")
{:error, :already_up} -> IO.puts("Database already exists for #{inspect(repo)}")
{:error, term} -> raise "Failed to create database: #{inspect(term)}"
end
end
end
def seed do
load_app()
for repo <- repos() do
{:ok, _, _} = Ecto.Migrator.with_repo(repo, fn _repo ->
seed_file = Application.app_dir(@app, "priv/repo/seeds.exs")
if File.exists?(seed_file) do
Code.eval_file(seed_file)
end
end)
end
end
defp repos do
Application.fetch_env!(@app, :ecto_repos)
end
defp load_app do
Application.ensure_all_started(:ssl)
Application.load(@app)
end
endRepoReadRepoconfig.exsconfig :<app_name>, ecto_repos: [<AppName>.Repo, <AppName>.ReadRepo]mix compilemix run -e "<AppName>.Release.migrate()"MIX_ENV=prod mix release_build/prod/rel/<app_name>/bin/<app_name> eval "<AppName>.Release.migrate()"# Create database (first deploy only)
bin/<app_name> eval "<AppName>.Release.migrate()"
# Run migrations
bin/<app_name> eval "<AppName>.Release.migrate()"
# Rollback to specific version
bin/<app_name> eval "<AppName>.Release.rollback(<AppName>.Repo, 20240101000000)"
# Seed database
bin/<app_name> eval "<AppName>.Release.seed()"Application.ensure_all_started(:ssl)Application.load(@app)config :app_name, ecto_repos: [...]