Ошибка при попытке реализовать тип расширения "geo" postgrex

Я следую этому уроку, который добавляет расширение Postgrex в config.exs с extensions поле. Однако теперь это устаревший способ добавить расширение Postgrex, теперь мы должны использовать type поле вместо extensions поле. Я следую коду на странице GitHub библиотеки гео, чтобы добавить расширение:

config.exs

Postgrex.Types.define(MyApp.PostgresTypes,
  [Geo.PostGIS.Extension] ++ Ecto.Adapters.Postgres.extensions(),
  json: Poison)

use Mix.Config

config :api, Api.Repo,
  types: MyApp.PostgresTypes,
  adapter: Ecto.Adapters.Postgres,
  database: "api_repo",
  username: "postgres",
  password: "postgres",
  hostname: "localhost",
  web_port: String.to_integer(System.get_env("PORT") || "4000"),
  timeout: 60_000,
  pool_timeout: 60_000

config :api, ecto_repos: [Api.Repo]

Но я получаю эту ошибку:

bash-3.2$ mix ecto.migrate
** (Mix.Config.LoadError) could not load config config/config.exs
    ** (UndefinedFunctionError) function Ecto.Adapters.Postgres.extensions/0 is undefined (module Ecto.Adapt
ers.Postgres is not available)
    Ecto.Adapters.Postgres.extensions()
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (stdlib) erl_eval.erl:470: :erl_eval.expr/5
    (stdlib) erl_eval.erl:878: :erl_eval.expr_list/6
    (stdlib) erl_eval.erl:404: :erl_eval.expr/5
    (stdlib) erl_eval.erl:122: :erl_eval.exprs/5

Я видел онлайн это иногда из-за версии Postgrex, однако это очень старая версия, и я использую {:postgrex, "~> 0.13.2"},, Что мне не хватает?

1 ответ

Решение

Строка, определяющая пользовательские типы Postgrex, должна идти в .ex файл, который скомпилирован с вашим приложением (что-нибудь в lib/ а также web/), а не в конфигурационном файле. Файлы конфигурации не имеют доступа к функциям зависимостей приложения.

Итак, если вы переместите этот код, например, в lib/my_app/postgres_types.ex:

Postgrex.Types.define(MyApp.PostgresTypes,
  [Geo.PostGIS.Extension] ++ Ecto.Adapters.Postgres.extensions(),
  json: Poison)

Вы больше не должны получать ошибку неопределенной функции, и все должно работать, если вы следовали остальным инструкциям в geo пакет правильно.

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