Невозможно запустить `mix ecto.migrate` без пароля с помощью одноранговой аутентификации - PullRequest
0 голосов
/ 24 сентября 2018

Обновление # 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.

1 Ответ

0 голосов
/ 24 сентября 2018

У меня есть это в моем config.exs:

use Mix.Config

config :test_ecto, ecto_repos: [TestEcto]

config :test_ecto, TestEcto,
  database: "test_ecto"

После создания БД через createdb test_ecto все работает нормально (я использую некоторый пример кода из ecto readme):

iex -S mix
Erlang/OTP 21 [erts-10.0.6] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]

Compiling 2 files (.ex)
Generated test_ecto app
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> TestEcto.start_link()
{:ok, #PID<0.250.0>}
iex(2)> TestEcto.pipe_query()

22:33:21.802 [debug] QUERY ERROR source="weather" db=3.9ms
SELECT w0."id", w0."city", w0."temp_lo", w0."temp_hi", w0."prcp" FROM "weather" AS w0 WHERE (w0."city" = 'Kraków') ORDER BY w0."temp_lo" LIMIT 10 []
** (Postgrex.Error) ERROR 42P01 (undefined_table): relation "weather" does not exist
    (ecto) lib/ecto/adapters/sql.ex:431: Ecto.Adapters.SQL.execute_and_cache/7
    (ecto) lib/ecto/repo/queryable.ex:133: Ecto.Repo.Queryable.execute/5
    (ecto) lib/ecto/repo/queryable.ex:37: Ecto.Repo.Queryable.all/4

Вы уверены, что не подключаетесь к БД по сети?

...