【问题标题】:adapter Ecto.Adapters.Postgres was not compiled适配器 Ecto.Adapters.Postgres 未编译
【发布时间】:2019-04-02 09:32:45
【问题描述】:

我无法创建我的 Phoenix 项目。希望得到一些关于如何解决它的建议。

设置详情:

  • Ubuntu 16.04.4 LTS
  • Erlang/OTP 21 [erts-10.1] [来源] [64 位] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]
  • Elixir 1.7.3(已编译 使用 Erlang/OTP 20)
  • Mix 1.7.3(使用 Erlang/OTP 20 编译)
  • Ecto v3.0.0

我正在关注Phoenix Up and Running 制作一个应用程序。

mix phx.new hello
cd hello
mix ecto.create

最后一个命令给了我:

 == Compilation error in file lib/hello/repo.ex ==
 ** (ArgumentError) adapter Ecto.Adapters.Postgres was not compiled, ensure it is correct and it is included as a project dependency
     lib/ecto/repo/supervisor.ex:71: Ecto.Repo.Supervisor.compile_config/2
     lib/hello/repo.ex:2: (module)
     (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
     (elixir) lib/kernel/parallel_compiler.ex:206: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6

我已经安装了 postgres。我有 postgres 超级用户。

【问题讨论】:

  • 在您的项目mix.exs 文件中。你的依赖项中有{:postgrex, ">= 0.0.0"} 之类的东西吗?
  • 是的,我在阅读一些博客后改为 {:postgrex, ">= 0.10.0"},但没有运气:(
  • 您是否将ecto_sql 包含为依赖项?

标签: postgresql elixir phoenix-framework ecto


【解决方案1】:

您的依赖项中有phoenix_ecto 3.5.0 吗?在我找出根本问题之前,降级到 3.4.0 对我来说是一种临时修复。

强制降级:

  1. 运行mix deps.clean --all
  2. 删除您的mix.lock 文件
  3. 更新您的mix.exs 文件,限制phoenix_ecto 版本。找到适当的行并替换为: {:phoenix_ecto, ">= 3.2.0 and < 3.5.0"},
  4. 运行mix deps.get

或者,如果你刚开始使用Phoenix,你可以使用1.4版本来学习,该版本即将发布,没有这个问题。

首先删除您当前的本地 Phoenix 存档:

mix archive.uninstall phx_new

然后,要安装最新的开发版,请按照https://github.com/phoenixframework/phoenix/blob/master/installer/README.md中的说明进行操作

【讨论】:

  • 刚开始的时候决定卸载并安装新的 RC 方法。谢谢
【解决方案2】:

从 Ecto 3.0 开始,Ecto 默认不附带 Ecto.Adapters.Postgres,因此您必须将 ecto_sql 添加到 Mixfile 依赖项中:

###########
# mix.exs #
###########
defp deps do
  [
    # (...)
    {:ecto_sql, "~> 3.0-rc.1"},
    {:postgrex, ">= 0.0.0"}
  ]
end

# Feeling skittish about dependencies, 
# I usually do this instead of simply 
# doing `mix deps.get`:

$ mix deps.clean --all
$ mix do deps.get, compile

(The Ecto github repo v3.0.0 tree 推荐{:ecto_sql, "~> 3.0"},但最新版本是3.0.0-rc.1) 因此它现在无法使用。有趣的是,repo 中没有3.0.0-rc.1 标签,但the documentation 已经引用了它,它也适用于mix

...或者,如Yufrend recommends in his answer,如果您要开始一个新的 Phoenix 项目,请使用


请参阅 José Valim 的 “A sneak peek at Ecto 3.0” series,其中第一篇文章解释了 Ecto 3.0 中的重大变化:

将 Ecto 拆分为 ectoecto_sql

Ecto 3.0 将在两个存储库中被破坏:ectoecto_sql。 自 Ecto 2.0 以来,越来越多的开发人员和团队已经 使用 Ecto 进行数据映射和验证,无需 数据库。但是,将 Ecto 添加到您的应用程序仍然会带来 许多 SQL 包袱,例如适配器、沙箱和迁移, 许多人认为这是一个混合信息。

在 Ecto 3.0 中,我们会将所有 SQL 适配器移动到单独的 存储库和 Ecto 将专注于四个构建块:模式, 变更集、查询和存储库。 You can see the discussion in the issues tracker.

如果您将 Ecto 与 SQL 数据库一起使用,迁移到 Ecto 3.0 将 非常直截了当。而不是:

{:ecto, "~> 2.2"}

你应该列出:

{:ecto_sql, "~> 3.0"}

如果您仅将 Ecto 用于数据操作但没有 数据库访问,那么它只是一个颠簸它的版本的问题。 就是这样!


更新

由于某种原因,我还需要在更新 Phoenix 1.3 项目时将 {:plug_cowboy, "~> 1.0"} 添加到 Mixfile 依赖项中,这一切都开始工作了。

【讨论】:

    【解决方案3】:

    安装新的 phoenix 版本对我有用。

    卸载旧版本:

    mix archive.uninstall phx_new
    

    安装新版本:

    mix archive.install hex phx_new 1.4.0-rc.2

    【讨论】:

      【解决方案4】:

      新项目

      要使用Ecto 3.0 创建新项目,强烈建议您升级到新的phoenix 1.4.x 安装程序:

      $ mix archive.uninstall phx_new
      $ mix archive.install hex phx_new 1.4.0-rc.2
      

      现有项目

      要将您现有的 Phoenix 1.3.x 项目升级到 1.4,请阅读 Official Upgrade Guide 和随附的 announcement

      TLDR是Ecto被分解成子包,需要明确指定:

      删除您的显式 :ecto 依赖项并使用以下版本更新您的 :phoenix_ecto:ecto_sql 依赖项:

      {:ecto_sql, "~> 3.0-rc"},
      {:phoenix_ecto, "~> 4.0"},
      

      【讨论】:

        猜你喜欢
        • 2014-05-24
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多