ENTRANCE

都内でエンジニアやってます。主にRubyとJavaを書いて遊んでる人のブログ。楽しくのんびりとがモットー。

【Ruby on Rails】同名のDBを作ることが出来ない時にやること

みなさんこんにちは、かっつんです!

rake db:createがうまく行かず、次のようなレスポンスが返ってくることありませんか?

$ rails db:create
Database 'sample_app_development' already exists
Database 'sample_app_test' already exists


(前提として、次のコマンドでアプリを作り始めた場合を想定して、説明をします。)

 $ rails new sample_app -d mysql
 # sample_appという名前のプロジェクトをmysqlのデータベースを使って新規作成という意味です。


already existsとあるように、同じ名前のデータベースが既に存在していることを意味しています。

MySQLでは同じ名称のデータベースを作成することは出来ないため、このようなレスポンスが返ってきます。

ですので、次のいずれかの方法で解決する必要があります。


それでは、順番に説明をしていきます!!


名前を変えて作成する方法

ところで、rake(rails) db:createコマンドを入力した時、
どうやってデータベースの名前が決まっているのでしょうか?

感覚的にプロジェクト名と同じ名前で生成されているな〜っと認識されているかもしれませんが、
データベースの名前を設定しているファイルがプロジェクト内に存在するのです。

それは、
(app名)/config/database.ymlというファイルで定義されています。
中身は次の通りです(一部省略)。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:  #開発環境
  <<: *default
  database: sample_app_development #生成されるデータベース名

test: #テスト環境
  <<: *default
  database: sample_app_test

production: #本番環境
  <<: *default
  database: sample_app_production
  username: sample_app
  password: <%= ENV['SAMPLE_APP_DATABASE_PASSWORD'] %>

ここで注目するのが、databese:この部分です!!
ここに続く部分が、データベースの名前になります!
デフォルトでは、プロジェクト名_環境名というルールで命名がされています。
このことから、以前作成したことのあるプロジェクト名と同名のプロジェクト名でDBを作ろうとすると、
既にありますよ!!!って言われてしまう訳です!


では、実際に変えてみましょう!!

development:  #開発環境
  <<: *default
  database: rename_sample_app_development #生成されるデータベース名

test: #テスト環境
  <<: *default
  database: rename_sample_app_test

このようにdatabase.ymlを編集し、もう一度rails db:createを試してみましょう!!

$ rails db:create
Created database 'rename_sample_app_development'
Created database 'rename_sample_app_test'


はい!!出来た!





既存のデータベースを消して、新たに作る方法

database.ymlを編集する方法でも説明した通り、デフォルトの状態での
データベースの名前は、プロジェクト名_環境名というルールで作成されます。
そのため、以前に作成したことのあるプロジェクトと同名のプロジェクトでデータベースを作成しようとすると失敗します。

であれば、既に存在しているDBを消せば、もう一度作成することも可能ということです!
(ただし、既存のDBを使うのであれば、この方法は使わないことをオススメします!)


では早速!次のコマンドで、MySQLに入ります!

$ mysql -u root

うまく入れていれば、次のように表示されるはずです。
(お使いのPCに入っているMySQLのバージョンによって、表示は多少異なるかもしれませんが、
最後の行のmysql>が表示されていればOKです。)

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.41 Homebrew

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 


では、次にデータベースを消すコマンドです。
データベースを消せば、その中のテーブルも同時に消去されます。(レコードも同様。)
(もし誤って削除してしまった場合も、ここでは説明しませんが復元することは可能です。)

mysql> drop database sample_app;

mysql>の部分は入力しないでください!(うまくMySQLに入れていれば既にターミナルに表示されています。)
最後のセミコロン(;)の入力も忘れないでくださいね!

これで消えるはずですが、、、、
こんなエラー出てる方もいるのでは??

mysql> drop database sample-app_development;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sample-app_development' at line 1



実は一つ注意しなければいけないことがあります。
それは、プロジェクト名に
-(ハイフン)が入ってる場合、これでは消えません。
プロジェクト名を`(バッククオート)で囲みましょう!!!

mysql> drop database `sample-app_development`;

うまく消せましたか?
うまく削除することができれば、次のような表示がされます!

Query OK, 0 rows affected (0.02 sec)


次のコマンドを入力することで、データベースを一覧表示して確認することも出来ます!

mysql>show databases;

消したかったDBがなければOKです!


以上です!
これで先ほどまで通らなかったrails(rake) db:createが通るようになってます!!