Ошибка аргумента:ets.lookup(:tzdata_current_release,:release_version) при запуске внутри миграции

У меня есть этот кусок кода:

case Timex.Timezone.get(data) do
  {:error, _} = error ->
    error

  data ->
    {:ok, data}
end

поместить часовые пояса, которые сохранены в базе данных, в структуру.

Хорошо при выполнении миграции, которая получает некоторые данные через Ecto Query, я получаю эту ошибку:

** (ArgumentError) ошибка аргумента (stdlib):ets.lookup(:tzdata_current_release,:release_version) lib/tzdata/release_reader.ex:47: Tzdata.ReleaseReader.current_release_from_table/0 lib/tzdata/release_reader.ex:.ReleaseReader.simple_lookup/1 lib/tzdata/release_reader.ex:7: Tzdata.ReleaseReader.zone_and_link_list/0 lib/tzdata.ex:40: Tzdata.zone_exists?/1 lib/timezone/timezone.ex:152: Timex.Timezone.name_of/1 lib/timezone/timezone.ex:180: Timex.Timezone.get/2 lib/common/ecto/timezone.ex:27: Common.Ecto.Timezone.load/1 (ecto) lib/ecto/type. пример: 661: Ecto.Type.process_loaders / 3 (ecto) lib / ecto / schema.ex: 1490: Ecto.Schema.load! / 5 (ecto) lib / ecto / schema.ex: 1442: Ecto.Schema.safe_load_zip / 4 (ecto) lib / ecto / schema.ex: 1443: Ecto.Schema.safe_load_zip / 4 (ecto) lib / ecto / schema.ex: 1430: Ecto.Schema.safe_load/ 6 (ecto) lib / ecto / repo / queryable.ex: 282: Ecto.Repo.Queryable.process_source / 6 (ecto) lib / ecto / repo / queryable.ex: 170: Ecto.Repo.Queryable.preprocess / 5 (postgrex) lib / postgrex / query.ex: 77: DBConnection.Query.Postgrex.Query.decode_map / 3 (postgrex) lib / postgrex / query.ex: 64: DBConnection.Query.Postgrex.Query.decode / 3 (db_connection) lib / db_connection.ex: 1019: DBConnection.decode / 6 (ecto) lib / ecto / adapters / postgres / connection.ex: 73: Ecto.Adapters.Postgres.Connection.prepare_execute / 5 (ecto) lib / ecto / adapters / sql.ex: 256: Ecto.Adapters.SQL.sql_call / 6

Который имеет этот код в трассировке стека, и выполнение некоторых проверок может проверить, что это действительно вызов, который вызывает ошибку, хотя делает:

iex (1)> Timex.Timezone.get ("America / Los_Angeles")

В iex -S mix работает.

1 ответ

Решение

Эта ошибка происходит потому, что Timex нужно начать функционировать. Обычно это делается автоматически, если вы добавляете его в свой mix.exs зависимости при запуске приложения. Однако в смешанных задачах вы должны вручную выбрать, какие приложения запускать. В ваших пользовательских задачах смешивания вы можете убедиться, что приложение запускается через Application.ensure_all_started(:timex),

В вашем ecto.migrate В данном случае у нас нет доступа к самой задаче микширования, поэтому нам нужно быть немного более креативным, используя псевдонимы микс в вашем mix.exs файл:

  def project do
    [
      ...
      aliases: aliases(),
      ...
    ] 
  end


  defp aliases do
    [
      "ecto.migrate_s": ["ecto.migrate.startup", "ecto.migrate"],
    ]
  end

И задача ecto.migrate.startup за наших Application.ensure_all_started(:timex)

defmodule Mix.Tasks.Ecto.Migrate.Startup do
  use Mix.Task

  def run(args) do
    Mix.shell.info("Starting apps required for ecto.migrate...")
    Application.ensure_all_started(:timex)
  end
end

Теперь вы должны быть в состоянии бежать mix ecto.migrate_s который начинается первым timex а затем запускает ваши миграции. (Это не совсем чистое решение, но я не знаю альтернатив)

Другие вопросы по тегам