Обновление # 2 - заработало благодаря https://github.com/elixir-ecto/ecto/issues/2719
Первоначальная проблема для будущих поколений:
Исходя из мира Rails, мне не нужнонастроить учетные данные базы данных для разработки следующим образом:
default: &default
adapter: postgresql
development:
<<: *default
database: app_development
Это достигается путем создания базы данных вручную в командной строке:
$ sudo -u postgres createdb -O $(whoami) app_development
$ psql app_development
psql (9.5.14)
Type "help" for help.
app_development=>
Это работает, поскольку по умолчанию Postgresql использует одноранговую аутентификацию в Ubuntu.Теперь попытка сделать то же самое с Phoenix + Ecto, похоже, не работает, однако я стараюсь.Я получаю такие ошибки, когда запускаю mix ecto.migrate
:
[error] GenServer #PID<0.504.0> terminating
** (RuntimeError) Connect raised a KeyError error. The exception details are hidden, as
they may contain sensitive data such as database credentials.
(elixir) lib/keyword.ex:386: Keyword.fetch!/2
(postgrex) lib/postgrex/protocol.ex:610: Postgrex.Protocol.auth_md5/4
(postgrex) lib/postgrex/protocol.ex:504: Postgrex.Protocol.handshake/2
(db_connection) lib/db_connection/connection.ex:135: DBConnection.Connection.connect/2
(connection) lib/connection.ex:622: Connection.enter_connect/5
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
** (exit) exited in: :gen_server.call(#PID<0.504.0>, {:checkout, #Reference<0.3638587783.2274885638.15614>, true, :infinity}, 5000)
** (EXIT) an exception was raised:
** (RuntimeError) Connect raised a KeyError error. The exception details are hidden, as
they may contain sensitive data such as database credentials.
(elixir) lib/keyword.ex:386: Keyword.fetch!/2
(postgrex) lib/postgrex/protocol.ex:610: Postgrex.Protocol.auth_md5/4
(postgrex) lib/postgrex/protocol.ex:504: Postgrex.Protocol.handshake/2
(db_connection) lib/db_connection/connection.ex:135: DBConnection.Connection.connect/2
(connection) lib/connection.ex:622: Connection.enter_connect/5
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
(db_connection) lib/db_connection/poolboy.ex:112: DBConnection.Poolboy.checkout/3
(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
(ecto) lib/ecto/adapters/postgres/connection.ex:86: Ecto.Adapters.Postgres.Connection.execute/4
(ecto) lib/ecto/adapters/sql.ex:256: Ecto.Adapters.SQL.sql_call/6
(ecto) lib/ecto/adapters/sql.ex:198: Ecto.Adapters.SQL.query!/5
(ecto) lib/ecto/adapters/postgres.ex:96: anonymous fn/4 in Ecto.Adapters.Postgres.execute_ddl/3
(elixir) lib/enum.ex:1925: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/adapters/postgres.ex:96: Ecto.Adapters.Postgres.execute_ddl/3
(ecto) lib/ecto/migrator.ex:44: anonymous fn/2 in Ecto.Migrator.migrated_versions/2
(ecto) lib/ecto/migrator.ex:300: Ecto.Migrator.verbose_schema_migration/3
(ecto) lib/ecto/migrator.ex:157: Ecto.Migrator.run/4
(ecto) lib/mix/tasks/ecto.migrate.ex:83: anonymous fn/4 in Mix.Tasks.Ecto.Migrate.run/2
(elixir) lib/enum.ex:765: Enum."-each/2-lists^foreach/1-0-"/2
(elixir) lib/enum.ex:765: Enum.each/2
(mix) lib/mix/task.ex:316: Mix.Task.run_task/3
(mix) lib/mix/cli.ex:79: Mix.CLI.run_task/2
Я что-то упустил или это единственный способ использовать PostgreSQL с Ecto для создания конкретного пользователя и пароля?Гораздо проще полагаться на одноранговую аутентификацию при разработке / тестировании IMHO.
Обновление № 1
Дополнительная информация и способы воспроизведения этой проблемы:
$ mix phx.new --version
Phoenix v1.3.4
$ mix phx.new --no-brunch hello
* creating hello/config/config.exs
...
Fetch and install dependencies? [Yn] y
* running mix deps.get
* running mix deps.compile
...
$ cd hello
$ sudo -u postgres createdb -O $(whoami) hello_dev
$ psql hello_dev -c "select 1"
?column?
----------
1
(1 row)
config / dev.exs имеет это в отношении базы данных:
config :hello, Hello.Repo,
adapter: Ecto.Adapters.Postgres,
database: "hello_dev"
Запуск mix ecto.migrate выдает ошибку выше.
Естьecto с версией 2.2.10 и phoenix_ecto с версией 3.4.0 в mix.lock.