Hanami の DB 設定

# 前回の訂正

[前回の記事](https://qiita.com/oda-i3/items/08a87587b3414b6c7270)で以下のように記述した。

> `$ rbenv exec hanami new sample-bookshelf --database=mysql`

このような実行をしたために、後々 config/environment.rb を修正する羽目になった。正しくは、以下のようにすれば良い。

`$ rbenv exec hanami new sample-bookshelf --database=mysql2`

ちゃんと `--help` に書いてあった。

```
$ rbenv exec hanami new --help
Command:
  hanami new

Usage:
  hanami new PROJECT

Description:
  Generate a new Hanami project

Arguments:
  PROJECT               # REQUIRED The project name

Options:
  --database=VALUE, -d VALUE        # Database (mysql/mysql2/postgresql/postgres/sqlite/sqlite3), default: "sqlite"
  --application-name=VALUE          # App name, default: "web"
  --application-base-url=VALUE      # App base URL, default: "/"
  --template=VALUE                  # Template engine (erb/haml/slim), default: "erb"
  --test=VALUE                      # Project testing framework (minitest/rspec), default: "minitest"
  --[no-]hanami-head                # Use Hanami HEAD (true/false), default: false
  --help, -h                        # Print this help

Examples:
  hanami new bookshelf                     # Basic usage
  hanami new bookshelf --test=rspec        # Setup RSpec testing framework
  hanami new bookshelf --database=postgres # Setup Postgres database
  hanami new bookshelf --template=slim     # Setup Slim template engine
  hanami new bookshelf --hanami-head       # Use Hanami HEAD
```

# エラーはいつも突然に

Hanami チュートリアルの [Writing Our First Test](http://hanamirb.org/guides/1.2/getting-started/#writing-our-first-test) にて以下を実施するようにある。

`% HANAMI_ENV=test bundle exec hanami db prepare`

実際に実行してみると以下のようなエラーが出た。

```
$ HANAMI_ENV=test bundle exec hanami db prepare
Mysql2::Error::ConnectionError: Access denied for user 'loginuser'@'localhost' (using password: NO)
（以下略）
```

MySQL のアカウントに loginuser なんて作っていないのでそりゃアクセスは拒否される。が、「**なんで loginuser で DB に接続しようとしているんだ？**」という素朴な疑問が湧いた。

# ぐぐるな！一次ソースをあたれ！

@udzura さんが言っていた言葉である。実はぐぐっていたのだが、答えは一次ソースの中にあった。

まず先述の　[Writing Our First Test](http://hanamirb.org/guides/1.2/getting-started/#writing-our-first-test)　に以下のような記述がある。

> Please check .env.test in case you need to tweak the database URL.

.env.test ファイルを参照してみる。

```
# Define ENV variables for test environment
DATABASE_URL="mysql2://localhost/sample_bookshelf_test"
SERVE_STATIC_ASSETS="true"
WEB_SESSIONS_SECRET="ないしょ"
```

RoR であれば　database.yml に username/password を仕込むので、ここでも似たようなものかと思っていた。答えは [Database Configuration](http://hanamirb.org/guides/1.2/models/database-configuration/#database-configuration) にあった。

> ＃ .env.test
> DATABASE_URL="database_type://username:password@localhost/bookshelf_test"

なんだ、こう記述すれば良かったのか。簡単じゃないか。

# 世の中そんなに甘くない

.env.test を修正のうえ、再度 prepare を実施してみると全く同じエラーが出る。これも前回の記事での誤りが影響している。
[前回のエラー](https://qiita.com/oda-i3/items/08a87587b3414b6c7270#%E7%AC%AC%E4%B8%89%E3%81%AE%E9%9B%A3%E9%96%A2)で `ENV` を参照せずに、直接 `mysql2://localhost/sample_bookshelf_development` を指定していたため、.env.test の `DATABASE_URL` が無意味なものとなっていた。よって、

* config/environment.rb の model の adapter はデフォルト通り、DATABASE_URL を参照するようにする
* test 環境では .env.test の DATABASE_URL に username:password を設定
* development 環境では .env.development の DATABASE_URL に username:password を設定

とするのが正しいお作法のようである。

# production 環境は？

ここで単純な疑問として「**production 環境はどうすればいいの？**」というものが思い浮かぶ。[前回のエラー](https://qiita.com/oda-i3/items/08a87587b3414b6c7270#%E7%AC%AC%E4%B8%89%E3%81%AE%E9%9B%A3%E9%96%A2)は production 環境である Heroku 上で動かした場合に発生している。そして、 .env.production なる設定ファイルは存在しない。

```
$ tree -a -L 1
.
├── apps
├── .bundle
├── config
├── config.ru
├── db
├── .env.development
├── .env.test
├── Gemfile
├── Gemfile.lock
├── .git
├── .gitignore
├── .hanamirc
├── lib
├── public
├── Rakefile
├── README.md
├── spec
└── vendor
```

どうすればいいものか？と思ってぐぐった（**一次ソースのことはひとまず置いておこう**）。

[Hanamiを本番に載せたらdotenvを読まなくって困った話](https://qiita.com/sizer/items/12220ae95cd7f6b9c547)

これも解決手段のうちの一つであると思う。ベストプラクティスなのかどうかは分からない。

ひとまず疲れたので今日はここまで。