LoginSignup
4
2

More than 5 years have passed since last update.

Hanami の DB 設定

Posted at

前回の訂正

前回の記事で以下のように記述した。

$ 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 にて以下を実施するようにある。

% 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 に以下のような記述がある。

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 にあった。

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

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

世の中そんなに甘くない

.env.test を修正のうえ、再度 prepare を実施してみると全く同じエラーが出る。これも前回の記事での誤りが影響している。
前回のエラー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 環境はどうすればいいの?」というものが思い浮かぶ。前回のエラーは 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を読まなくって困った話

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

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

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2