【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
が通るようになってます!!