не удалось подключиться: ** (Postgrex.Error) FATAL (invalid_catalog_name): база данных "api_example_dev" не существует - PullRequest
0 голосов
/ 02 мая 2018

Я создаю простой API Rest с использованием Phoenix. Я получаю следующую ошибку при выполнении команды: 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

Когда я запускаю 'mix test', я получаю:

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>

файл config / 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

1 Ответ

0 голосов
/ 03 мая 2018

Вам нужно запустить mix ecto.create, поскольку сейчас нет базы данных для переноса. После этого вы можете запустить mix ecto.migrate, и он выполнит миграцию. Чтобы увидеть список всех команд микширования, используйте mix help. Вот список текущих доступных задач экто:

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

Если вы используете 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 я очень рекомендую PostgresApp от Heroku (https://postgresapp.com/) вместо homebrew или system postgresql.

Если вы дадите мне в комментарии информацию о том, на какой ОС вы работаете, если вышеперечисленное не работает, и я обновлю свой ответ инструкциями для вас.

...