postgresql - 尝试实现 "geo"postgres 扩展类型时出错

标签 postgresql ecto elixir postgrex

我正在关注 this tutorial它使用 extensions 字段将 postgrex 扩展添加到 config.exs 中。然而,现在这是一种添加 postgrex 扩展的弃用方式,我们现在应该使用 type 字段而不是 extensions 字段。我正在关注 geo library github page 上的代码, 添加扩展名:

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

我在网上看到这有时是由于 version of postgrex然而这是一个非常旧的版本,我正在使用 {:postgrex, "~> 0.13.2"},。我错过了什么?

最佳答案

定义自定义 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 包中的其余指令,一切都应该工作。

关于postgresql - 尝试实现 "geo"postgres 扩展类型时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44224821/

相关文章:

elixir - 用 Phoenix 格式化时间

postgresql - PostGIS - 路线匹配解决方案

json - Postgresql jsonb_agg 子查询排序

postgresql - 使用 F# 中的 Npgsql 的用户定义的 postgresql 类型

sql - 从多个表中获取信息的查询

arrays - insert with unnest 函数 - 跳过 serial 列中的数字

mysql - Phoenix-Framework : transform, 在创建子模型时关联和不检查 Ecto 父模型

Elixir [42] 打印为 '*'

postgresql - 运行 mix ecto.setup 命令时连接被拒绝,使用 asdf 安装的软件包

npm - Phoenix 框架 - 在子目录中执行 NPM 脚本