【问题标题】:Unable to create new Postgres Table for Elixir's Phoenix无法为 Elixir 的 Phoenix 创建新的 Postgres 表
【发布时间】:2020-12-27 02:14:56
【问题描述】:

我关注https://robots.thoughtbot.com/testing-a-phoenix-elixir-json-api

我正在尝试创建迁移。

当我运行 mix ecto.migrate 时,我得到:

/code/mpa:.mix ecto.migrate
** (exit) exited in: GenServer.call(#PID<0.141.0>, {:query, "CREATE TABLE IF NOT EXISTS \"schema_migrations\" (\"version\" bigint PRIMARY KEY, \"inserted_at\" timestamp)", []}, :infinity)
    ** (EXIT) %Postgrex.Error{message: nil, postgres: %{code: :invalid_catalog_name, file: "postinit.c", line: "794", message: "database \"mpa_dev\" does not exist", pg_code: "3D000", routine: "InitPostgres", severity: "FATAL"}}
    (elixir) lib/gen_server.ex:356: GenServer.call/3
    (postgrex) lib/postgrex/connection.ex:102: Postgrex.Connection.query/4
    (ecto) lib/ecto/adapters/postgres/connection.ex:31: Ecto.Adapters.Postgres.Connection.query/4
    (ecto) lib/ecto/adapters/sql.ex:228: Ecto.Adapters.SQL.query/7
    (ecto) lib/ecto/pool.ex:159: Ecto.Pool.do_run/4
    (ecto) lib/ecto/adapters/sql.ex:216: Ecto.Adapters.SQL.query/6
    (ecto) lib/ecto/adapters/sql.ex:191: Ecto.Adapters.SQL.query/5
    (elixir) lib/enum.ex:1261: Enum."-reduce/3-lists^foldl/2-0-"/3

但我刚刚创建了表格。签入 Postgres:

~:.psql -d template1
psql (9.4.4)
Type "help" for help.

template1=# CREATE TABLE mpa_dev();
ERROR:  relation "mpa_dev" already exists
template1=#

为什么会出现此错误以及如何创建表?

【问题讨论】:

    标签: postgresql elixir phoenix-framework


    【解决方案1】:

    从错误消息中可以清楚地看出:

    “数据库\“mpa_dev\”不存在”

    您需要创建一个名为“mpa_dev”的数据库:

    createdb mpa_dev
    

    然后运行

    mix ecto.migrate
    

    如果您希望数据库名称为 template1(如您在示例中提到的),请在 config/dev.exs 中编辑数据库名称并再次运行 mix ecto.migrate

    【讨论】:

      【解决方案2】:

      错误信息是抱怨 database "mpa_dev" 不存在,并且您正在检查内置数据库 template1 中是否存在 table "mpa_dev" .

      我的猜测是,当您打算创建一个单独的数据库时,您已经在数据库 template1 中创建了一个表。如果连接到 template1,您将使用命令创建一个数据库:

      CREATE DATABASE mpa_dev;
      

      请参阅:手册中的CREATE DATABASE。您也可以在 shell 中使用命令行createdb 命令。

      还请注意,通常在模板 1 中创建表不是一个好主意,因为模板 1 是用于创建您使用 CREATE DATABASE 创建的任何新数据库的默认模板。由于您已经在 template1 中创建了一个表,因此从现在开始,您创建的每个新数据库都将包含该表。我建议您在执行其他任何操作之前删除该表。

      【讨论】:

        【解决方案3】:

        其他两个答案(由harmic 和emaillenin 提供)都提供了一种创建数据库的方法。如果您有权限,我只想指出第三个选项:

        mix ecto.create
        

        这也将创建数据库。这具有与任何存储后端一起工作的好处。 http://hexdocs.pm/ecto/0.15.0/Mix.Tasks.Ecto.Create.html

        【讨论】:

          【解决方案4】:
          message: "database \"mpa_dev\" does not exist"
          

          我猜数据库不存在。

          我愿意:

          mix ecto.create
          mix ecto.migrate
          

          【讨论】:

            猜你喜欢
            • 2014-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-01
            • 2017-04-05
            • 2023-03-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多