前回はWebサーバの起動までやりましたので、DBの設定をしてみましょう。
今回はデフォルトのPostgreを使います。なおMysqlはプロジェクト作成時に指定すれば使えるそうです。
とりあえず実行
とりあえずPhoenixというかElixirのDB操作ライブラリEctoのコマンドを叩いてみます。これはデータベースを作成するコマンドです。
~/workspace/hello_phoenix $ mix ecto.create
** (Mix) The database for HelloPhoenix.Repo couldn't be created, reason given: psql: could not connect to server: Connection refused
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
はい。とうぜん失敗します。DBサーバを立ち上げていません。
DB起動
DBを起動しましょう。
https://docs.c9.io/docs/setting-up-postgresql
~/workspace/hello_phoenix $ sudo service postgresql start
* Starting PostgreSQL 9.3 database server
...done.
接続テスト
~/workspace/hello_phoenix $ sudo sudo -u postgres psql
psql (9.3.10)
Type "help" for help.
postgres=# \q
:~/workspace/hello_phoenix $
CLI上では繋がりました。
もっかい実行
~/workspace/hello_phoenix $ mix ecto.create
** (Mix) The database for HelloPhoenix.Repo couldn't be created, reason given: psql: FATAL: password authentication failed for user "postgres"
.
はい。まだ駄目です。認証に失敗してますね。
試しにパスワードを消してみる
CLIではパスワードなしで接続できたのでパスワードを消してみます。
config :hello_phoenix, HelloPhoenix.Repo,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "",
database: "hello_phoenix_dev",
hostname: "localhost",
pool_size: 10
実行。
~/workspace/hello_phoenix $ mix ecto.create
** (Mix) The database for HelloPhoenix.Repo couldn't be created, reason given: psql: FATAL: password authentication failed for user "postgres"
.
qooq:~/workspace/hello_phoenix $ mix ecto.create
Compiled lib/hello_phoenix.ex
Compiled web/web.ex
Compiled web/views/error_helpers.ex
Compiled web/channels/user_socket.ex
Compiled web/gettext.ex
Compiled lib/hello_phoenix/repo.ex
Compiled web/router.ex
Compiled web/views/error_view.ex
Compiled web/views/page_view.ex
Compiled web/views/layout_view.ex
Compiled web/controllers/page_controller.ex
Compiled lib/hello_phoenix/endpoint.ex
Generated hello_phoenix app
** (Mix) The database for HelloPhoenix.Repo couldn't be created, reason given: psql: fe_sendauth: no password supplied
.
ダメですね。パスワードは必要なようです。
パスワードを設定しましょう。
パスワードの設定
~/workspace/hello_phoenix $ sudo sudo -u postgres psql
psql (9.3.10)
Type "help" for help.
postgres=# \password
Enter new password:
Enter it again:
postgres=# \q
~/workspace/hello_phoenix $
config :hello_phoenix, HelloPhoenix.Repo,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "hello_phoenix_dev",
hostname: "localhost",
pool_size: 10
では実行
~/workspace/hello_phoenix $ mix ecto.create
Compiled lib/hello_phoenix.ex
Compiled web/views/error_helpers.ex
Compiled web/channels/user_socket.ex
Compiled web/web.ex
Compiled web/gettext.ex
Compiled lib/hello_phoenix/repo.ex
Compiled web/views/error_view.ex
Compiled web/router.ex
Compiled web/views/page_view.ex
Compiled web/controllers/page_controller.ex
Compiled web/views/layout_view.ex
Compiled lib/hello_phoenix/endpoint.ex
Generated hello_phoenix app
** (Mix) The database for HelloPhoenix.Repo couldn't be created, reason given: ERROR: 22023: new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)
HINT: Use the same encoding as in the template database, or use template0 as template.
LOCATION: createdb, dbcommands.c:359
今度はまた別のエラーで失敗しました。どうもテンプレートというものが指定されてないようです。PostgreではDBの作成はテンプレートをコピーするという形で行われているようです。
https://chodounsky.net/2015/05/26/elixir-ecto-database-create-failed-on-sql-ascii/
テンプレートの指定
ではテンプレートを指定しましょう。
config :hello_phoenix, HelloPhoenix.Repo,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "hello_phoenix_dev",
hostname: "localhost",
template: "template0",
pool_size: 10
ではもう一度です。
~/workspace/hello_phoenix $ mix ecto.create
Compiled lib/hello_phoenix.ex
Compiled web/channels/user_socket.ex
Compiled web/views/error_helpers.ex
Compiled web/web.ex
Compiled web/gettext.ex
Compiled lib/hello_phoenix/repo.ex
Compiled web/router.ex
Compiled web/views/error_view.ex
Compiled web/controllers/page_controller.ex
Compiled web/views/page_view.ex
Compiled web/views/layout_view.ex
Compiled lib/hello_phoenix/endpoint.ex
Generated hello_phoenix app
The database for HelloPhoenix.Repo has been created.
作成できました!いちおうCLIで確認しましょう。
~/workspace/hello_phoenix $ sudo sudo -u postgres psql
psql (9.3.10)
Type "help" for help.
postgres=# \list
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-------------------+----------+-----------+---------+-------+-----------------------
hello_phoenix_dev | postgres | UTF8 | C | C |
postgres | postgres | SQL_ASCII | C | C |
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
hello_phoenix_devができていますね。
これでDBとの接続に成功です。