読者です 読者をやめる 読者になる 読者になる

Rails の rake db:create がひどい

Rails でアプリケーションの初期化はこんな感じになると思います。

% rails new hoge -d mysql
% cd hoge
% mysql -uroot -p
mysql> create user hoge@localhost identified by 'abcdefg';
mysql> grant all on hoge_development.* to hoge@localhost;
mysql> grant all on hoge_test.* to hoge@localhost;

% vi config/database.yml
development:
  〜
  username: hoge
  password: abcdefg
  〜
test:
  〜
  username: hoge
  password: abcdefg

% rake db:create

で、rake db:create はこんなクエリで hoge_development と hoge_test データベースを作ってます。

CREATE DATABASE `hoge_development` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`
CREATE DATABASE `hoge_test` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`

ここで config/database.yml に記述するユーザー名やパスワードを間違えてしまったとします。

すると何故か MySQL の root のパスワードを聞いてきます。

% rake db:create
Access denied for user 'hoge'@'localhost' (using password: YES). 
Please provide the root password for your mysql installation
>

ここで素直に root のパスワードを入力すると、なんとパスワードが config/database.yml に書いたものに変更されてしまいます(ユーザー名が誤っていた場合はそのユーザーが MySQL に登録されます)!!

これはひどい!!

その時のクエリはこんな感じです。

CREATE DATABASE `hoge_development` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`
GRANT ALL PRIVILEGES ON hoge_development.* TO 'hoge'@'localhost' IDENTIFIED BY 'abcdefg' WITH GRANT OPTION

ご丁寧に GRANT OPTION までついています。これを付けられたユーザーは自分の持っている権限を他の MySQL ユーザーに付与することができるようになります。パスワードが変更されるだけでなく、こんな余計な権限をつけるとは…。

そういうわけで、rake db:create が root のパスワードを要求した時には Ctrl-C で止めて config/database.yml を見直すのが良いと思います。