连接失败:**(Postgrex.Error)致命(invalid_catalog_name):数据库“api_example_dev”不存在

Raf*_*sto 6 elixir ecto phoenix-framework

我正在使用 Phoenix 创建一个简单的 API Rest。执行命令时出现以下错误:mix ecto.migrate

22:25:14.197 [error] Postgrex.Protocol (#PID<0.193.0>) failed to connect: ** (Postgrex.Error) FATAL (invalid_catalog_name): database "api_example_dev" does not exist
** (DBConnection.ConnectionError) connection not available because of disconnection
    (db_connection) lib/db_connection.ex:934: DBConnection.checkout/2
    (db_connection) lib/db_connection.ex:750: DBConnection.run/3
    (db_connection) lib/db_connection.ex:1141: DBConnection.run_meter/3
    (db_connection) lib/db_connection.ex:592: DBConnection.prepare_execute/4
    (ecto) lib/ecto/adapters/postgres/connection.ex:91: Ecto.Adapters.Postgres.Connection.execute/4
    (ecto) lib/ecto/adapters/sql.ex:235: Ecto.Adapters.SQL.sql_call/6
    (ecto) lib/ecto/adapters/sql.ex:185: Ecto.Adapters.SQL.query!/5
    (ecto) lib/ecto/adapters/postgres.ex:71: Ecto.Adapters.Postgres.execute_ddl/3
    (ecto) lib/ecto/migrator.ex:43: Ecto.Migrator.migrated_versions/2
    (ecto) lib/ecto/migrator.ex:142: Ecto.Migrator.run/4
    (ecto) lib/mix/tasks/ecto.migrate.ex:84: anonymous fn/4 in Mix.Tasks.Ecto.Migrate.run/2
    (elixir) lib/enum.ex:737: Enum."-each/2-lists^foreach/1-0-"/2
    (elixir) lib/enum.ex:737: Enum.each/2
    (mix) lib/mix/task.ex:314: Mix.Task.run_task/3
    (mix) lib/mix/cli.ex:80: Mix.CLI.run_task/2
    (elixir) lib/code.ex:677: Code.require_file/2
Run Code Online (Sandbox Code Playgroud)

当我运行“混合测试”时,我得到:

Generated api_example app
** (Mix) The database for ApiExample.Repo couldn't be created: exited in: :gen_server.call(#PID<0.2449.0>, {:checkout, #Reference<0.2107810362.96468993.2762>, true, 15000}, 5000)
    ** (EXIT) time out

22:24:29.587 [error] Task #PID<0.2448.0> started from #PID<0.74.0> terminating
** (stop) exited in: :gen_server.call(#PID<0.2449.0>, {:checkout, #Reference<0.2107810362.96468993.2762>, true, 15000}, 5000)
    ** (EXIT) time out
    (db_connection) lib/db_connection/connection.ex:54: DBConnection.Connection.checkout/2
    (db_connection) lib/db_connection.ex:928: DBConnection.checkout/2
    (db_connection) lib/db_connection.ex:750: DBConnection.run/3
    (db_connection) lib/db_connection.ex:1141: DBConnection.run_meter/3
    (db_connection) lib/db_connection.ex:592: DBConnection.prepare_execute/4
    lib/ecto/adapters/postgres/connection.ex:91: Ecto.Adapters.Postgres.Connection.execute/4
    lib/ecto/adapters/postgres.ex:203: anonymous fn/2 in Ecto.Adapters.Postgres.run_query/2
    (elixir) lib/task/supervised.ex:88: Task.Supervised.do_apply/2
Function: #Function<4.100334649/0 in Ecto.Adapters.Postgres.run_query/2>
Run Code Online (Sandbox Code Playgroud)

文件配置/dev.exs:

# Configure your database
config :api_example, ApiExample.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "postgres",
  password: "postgres",
  database: "api_example_dev",
  hostname: "localhost",
  pool_size: 10
Run Code Online (Sandbox Code Playgroud)

teh*_*sor 8

您需要运行,mix ecto.create因为现在没有要迁移的数据库。完成后,您可以运行它mix ecto.migrate,它将执行迁移。要查看所有混合命令的列表,请使用mix help。以下是当前可用的 ecto 任务的列表:

mix ecto                 # Prints Ecto help information
mix ecto.create          # Creates the repository storage
mix ecto.drop            # Drops the repository storage
mix ecto.dump            # Dumps the repository database structure
mix ecto.gen.migration   # Generates a new migration for the repo
mix ecto.gen.repo        # Generates a new repository
mix ecto.load            # Loads previously dumped database structure
mix ecto.migrate         # Runs the repository migrations
mix ecto.migrations      # Displays the repository migration status
mix ecto.rollback        # Rolls back the repository migrations
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 postgresql,如果上述内容不清楚,您可以放心地假设该术语的repository storage意思。database

如果mix ecto.create失败,则说明postgresql没有运行或者没有安装。

要查看它是否正在运行,请尝试:

ps auxwww | grep postgres

你应该看到类似的东西:

username 952 0.0 0.0 2656344 388 ?? S 19Apr18 0:47.05 /Applications/Postgres.app/Contents/Versions/9.6/bin/postgres -D /Users/username/Library/Application Support/Postgres/var-9.6

如果没有(请参阅与上面类似的内容),则需要启动它或安装它(如果没有)。

在 MacOS 上,我强烈推荐 Heroku 的 PostgresApp ( https://postgresapp.com/ ),而不是自制程序或系统 postgresql。

如果您在评论中告诉我您正在使用什么操作系统(如果上述方法不起作用),我将使用操作系统说明为您更新我的答案。