1
votes

Update #2 - got it working thanks to https://github.com/elixir-ecto/ecto/issues/2719

Initial problem for future generations:

Coming from Rails world, I don't need to configure database credentials for development like this:

default: &default
  adapter: postgresql

development:
  <<: *default
  database: app_development

This is achieved by creating database manually on the command line:

$ sudo -u postgres createdb -O $(whoami) app_development
$ psql app_development
psql (9.5.14)
Type "help" for help.

app_development=>

This works since by default Postgresql uses peer authentication on Ubuntu. Now, trying same thing with Phoenix + Ecto does not seem to work however I try. I'm getting errors like this, when running 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

Am I missing something or is the only way of using PostgreSQL with Ecto to create a specific user and password? It's much easier to rely on peer authentication in development/test IMHO.

Update #1

More information and how to reproduce this issue:

$ 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 has this regarding database:

config :hello, Hello.Repo,
  adapter: Ecto.Adapters.Postgres,
  database: "hello_dev"

Running mix ecto.migrate produces error above.

There's ecto with a version of 2.2.10 and phoenix_ecto with a version 3.4.0 in mix.lock.

1
How is ecto connecting? Is it using IP or Pipe? What IP address is it connecting from?Joe Love
I tried ecto configuration with specifying my linux username, without specifying it, with specifying hostname as localhost, without specifying it etc. Maybe the problem is that I need to configure it somehow differently than it is by default and I just don't know what it accepts as a configuration for peer authentication.Jarmo Pertman
Please share the content of your config/dev.exs if it exists (by default it does.)Aleksei Matiushkin
@mudasobwa updated post with more informationJarmo Pertman

1 Answers

0
votes

I have this in my config.exs:

use Mix.Config

config :test_ecto, ecto_repos: [TestEcto]

config :test_ecto, TestEcto,
  database: "test_ecto"

After creating a DB via createdb test_ecto, it is working just fine (I'm using some example code from 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

Are you sure you're not connecting to the DB via network?