首页 > 解决方案 > 在 Elixir 生产部署期间数据库种子未运行

问题描述

灵药版本:1.4

凤凰版:1.3.4

我有一个 release_task.ex 文件定义为

defmodule Campaigns.ReleaseTasks do
  @start_apps [
    :mix,
    :crypto,
    :ssl,
    :postgrex,
    :ecto_sql,
    :ecto
  ]

  @repos Application.get_env(:campaigns, :ecto_repos, [])

  def migrate(_argv) do
    start_services()
    run_migrations()
    stop_services()
  end

  def seed(_argv) do
    start_services()
    run_migrations()
    run_seeds()
    stop_services()
  end

  defp start_services do
    IO.puts("Starting dependencies...")
    # Start apps necessary for executing migrations
    Enum.each(@start_apps, &Application.ensure_all_started/1)

    # Start the Repo(s) for app
    IO.puts("Starting repos...")
    Enum.each(@repos, & &1.start_link(pool_size: 2))
  end

  defp stop_services do
    IO.puts("Success!")
    :init.stop()
  end

  defp run_migrations do
    Enum.each(@repos, &run_migrations_for/1)
  end

  defp run_migrations_for(repo) do
    app = Keyword.get(repo.config, :otp_app)
    IO.puts("Running migrations for #{app}")
    migrations_path = priv_path_for(repo, "migrations")
    Ecto.Migrator.run(repo, migrations_path, :up, all: true, prefix: :campaigns)
  end

  defp run_seeds do
    run_seeds_for(Enum.at(@repos, 0))
  end

  defp run_seeds_for(repo) do
    # Run the seed script if it exists
    seed_script = priv_path_for(repo, "seeds.exs")

    if File.exists?(seed_script) do
      IO.puts("Running seed script..")
      
      #
      # CODE FAILS AT THIS STEP
      #
      Code.eval_file(seed_script)
    end
  end

  defp priv_path_for(repo, filename) do
    app = Keyword.get(repo.config, :otp_app)

    repo_underscore =
      repo
      |> Module.split()
      |> List.last()
      |> Macro.underscore()

    priv_dir = "#{:code.priv_dir(app)}"

    Path.join([priv_dir, repo_underscore, filename])
  end
end

当我触发我的种子功能/opt/app/bin/campaigns seed时,我docker-migrations.sh收到一个错误,例如

▸  Evaluation failed with: could not lookup Ecto repo Campaigns.Repo.ReadOnly1 because it was not started or it does not exist
▸      (ecto) lib/ecto/repo/registry.ex:19: Ecto.Repo.Registry.lookup/1
▸      (ecto) lib/ecto/repo/queryable.ex:173: Ecto.Repo.Queryable.execute/4
▸      (ecto) lib/ecto/repo/queryable.ex:17: Ecto.Repo.Queryable.all/3
▸      (ecto) lib/ecto/repo/queryable.ex:112: Ecto.Repo.Queryable.one/3
▸      (campaigns) lib/campaigns/models/category.ex:20: Campaigns.Models.Category.upsert/2
▸      (elixir) lib/enum.ex:769: Enum."-each/2-lists^foreach/1-0-"/2
▸      (elixir) lib/enum.ex:769: Enum.each/2
▸      (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6

此时触发异常Code.eval_file(seed_script)

知道这里出了什么问题。

标签: elixirphoenix-framework

解决方案


推荐阅读