Ruby on RailsでのMySQLのエラー解決、データベース作成~テーブル作成までの覚書き
ひょんなことからRuby on Railsを触り始めるようになった。
いや、PHPでも色々できることが昔より増えたせいでマンネリ化してるな、と感じたので。好きなカレーも3日に1回とかじゃ飽きるのよ。
で、まぁ、元々自分は各種スクリプト型言語はヒャッハーな状態で使ったり使いこなせたりするけど、コンパイルが必要な言語に関してはかなり苦手なタイプである。
だって、リリースした後にチョイミスとかで問題が見つかっても反映までに時間掛かるじゃん。そしてミスガーミスガーとかでなじられーの、いちいちコンパイル→リモートデスクトップ→リリースとか正直やる気ゼロ。前時代的ぃ~。(某赤い髪の子の口調を借りて)
すなわち、やる気ゼロなので使えないことはないとかそういうレベル。
そして、CakePHPだとかLaravelだとかのフレームワークを色々試してみたけど、PHPそのものが自分の中でマンネリ化してるのでどうせなら、オブジェクト指向型で使いやすそうな言語(and フレームワーク)はないかと思って、同じようなスクリプト型言語であるRubyに落ち着いた。
日本人が開発した言語なお陰で、チュートリアルサイトも多数あり、フレームワークもRails一択状態なので、PHPと違ってなんのフレームワークを使うかも悩まなくて済む。
そして、いざテストでWebアプリケーションを作るまでに中核となるHello World表示~データベース操作までのチュートリアルやってみっか!と思って、RubyとRailsをインストール。
RubyとRailsのインストールはWindowsだろうがLinuxだろうがハマるところが皆無なので、すんなりHello Worldまでは表示できた。
だが、いざデータベースを使おうとしたときに問題発生。
これ、デフォルトのDB設定がSQLiteなのよね。Webアプリ作るためにはちょっと都合が悪い。
で、チュートリアルを見つつ、WebアプリのDBをMySQLサーバーにつなげようとしたんだが、Gemfilesとdatabase.ymlの設定だけだと無理でした!これも乾巧ってやつの仕業なんだ…。
MySQLサーバーに繋ぐ場合はRuby側にMySQLのアダプタ(コネクタ)が必要なようで、そいつを入れておかないことにはMySQLサーバーが使えない。
で、チュートリアルを見てれば、懇切丁寧にRails側からRuby側へMySQLサーバーのアダプタの入れ方も書いてある。
ありがとう!そしてありがとう!
…感謝の言葉もつかの間、入れたはずのMySQLサーバーのアダプタで四苦八苦した。
だってWindowsでもLinuxでも「cannot load such file — mysql2」ばっか出るんだもん。
で、ここでようやく今回の記事のお題目となるわけだ。おっそいわ。
この先、また同じように悩むこと請け合いなので、エラーの解決とデータベース作成~テーブルの作成の手順をまとめてみた。
エラーの解決とデータベース作成~テーブル作成 手順
Ruby on RailsでアプリからのMySQLサーバーへの設定そのものは「【アプリのディレクトリ】/Gemfiles」と【アプリのディレクトリ】/config/database.yml」へ記載で設定できるが、長々と書いたようにインストール後にMySQLを使うためにはアダプタないし、コネクタと言うものが必要となってくる。
サーバーや開発環境下にゼロベースのLAMR環境を構築している場合、いざMySQLのRails用のデータベースやテーブルを作ろうとしてコマンドを打った際には大抵ここで躓くと思う。
でも、負けないこと、逃げ出さないこと、投げ出さないこと、信じぬくことの精神で根気よく一個ずつ解決していこう。
そもそもアダプタがインストールできねーよ!!
データベースとかテーブル作る以前に、MySQLサーバーを入れてるのに、アダプタがインストールできねーよ!ってなった場合。
これは単にmysql-develのパッケージがインストールされていない可能性が高い。
ゼロから構築したLinux環境だと発生が多そうなケースかな?
WindowsとかMacとかの開発環境では多分発生しないはず。どうせXAMPPで動かすし。
使用しているリポジトリにもよるが、Cent OSの場合は以下のコマンドでmysql-develの存在を確認できる。
yum list installed mysql-devel
これでmysql-develの存在が確認できるのでインストールされていない場合は、インストールを行う。
(余談だが、これはWordPressとかを使うときにも要ったはず。)
これにより、「【Rubyのディレクトリ】/bin」で以下のコマンドが通るようになる。
gem install mysql2 # Rails側でアダプタはインストールできるので実行の必要はあまりない
実際はクリーンな状態のRubyに、Railsアプリ側から「【アプリのディレクトリ】/Gemfiles」によってインストールすることになるので、上記のコマンドの実行の必要はあまりない。
というか、できるかぎり必要なgemはRails側から入れましょうよ。
まぁこれでアダプタのインストール時の問題は解決できる・・・ハズ。
Gemfilesでアダプタのインストールしたのにエラーするんだけど!?
「【アプリのディレクトリ】/Gemfiles」でMySQLサーバーのアダプタを入れているはずなのにも関わらず、データベースやテーブル作成時にエラーが発生する場合。
具体的には「cannot load such file — mysql2/X.X/mysql2」「cannot load such file — mysql2/mysql2」とかいうエラー。
これはおきてる事象が違うので、使用するOSで少し対応が異なってくる。(例:自分の開発環境はWindows、サーバーはLinux。)
まずはLinuxと多分Mac
大抵はRails側の「【アプリのディレクトリ】/config/database.yml」でMySQLサーバーのデータベースを指定し、「【アプリのディレクトリ】/Gemfiles」で以下のようにmysql2をインストールする記述を行うと思う。
# gem sqlite # mysql2へ差し替え gem mysql2
アダプタのインストールをRailsアプリからRubyに対して要求しており、これで普通はアダプタが入るはず・・・と思いきや、いざデータベースを作成しようとするとエラーが起こる。
このエラーが発生するのは、使っているRubyに対応するバージョンのアダプタが入っていないから。
なので、解決するためにバージョンを指定する。
gem mysql2 , '~> 0.4.9'
上記はmysql2-0.4.9を指定している。
まぁ、RubyとRailsを個別にインストールした際とかにもしかしたら発生するエラーなのかもしれない。
バージョン指定が終わったら、ちゃんと【アプリのディレクトリ】でインストールを実行し忘れずに。
bundle install
まぁとりあえず、自分の使うRubyのバージョンのMySQLのアダプタが入っているかどうかの確認や、どんなバージョンのアダプタが入っているかは「【Rubyのディレクトリ】/lib/ruby/gems」をmysqlでfindしてみるといいと思う。
きちんとRubyの各バージョンごとのmysql2.moファイルがあるから決められたとおりにやればちゃんと解決する。
問題児のWindows。
俺みたいな平凡なユーザーにはこんなのがお似合いだ。これでいい・・・いや、これがいい。(ゴローさん風)
Windowsはですねー、なんとですねー・・・
gemでインストールできるアダプタが使えないんですよ。流石オープンソース!窓のディスり方がハンパじゃねぇ!!
なので、アダプタの代替としてMySQLの公式が出しているコネクタを入れる必要がある。(C言語でかかれているらしい。)
MySQLの公式のこの辺りからRuby用のコネクタをダウンロード。
ダウンロードができたらマルチバイト文字の入っていないディレクトリのどこでもいいので展開して、「【展開したフォルダのディレクトリ】/lib」から「libmysql.dll」を「【Rubyのディレクトリ】/lib」へコピペ。
終わったら「【Rubyのディレクトリ】/bin」で下記のコマンドを実行する。
gem install mysql2 --platform=ruby -- '--with-mysql-lib="【展開したフォルダのディレクトリ】\mysql-connector-c-N.N.N-win【bit数】\lib" --with-mysql-include="【展開したフォルダのディレクトリ】\mysql-connector-c-N.N.N-win【bit数】\include"'
これでコネクタのインストールが終わり、アダプタ的な働きをしてくれるようになる。
普通にコネクタの展開したフォルダを–with-mysql-dirで指定しただけではRails側でアダプタとして認識されないため、上記のような書き方となる。
特に開発環境に意気揚々と入れたRuby2.4ではね。何をやっても「cannot load such file — mysql2/2.4/mysql2」とか出てきて四苦八苦。自分はここでハマった。
英語サイトを見ていたら「Windows用の2.4のmysql2.moはまだないです、Ruby2.3ベースでやってね^^」とか書いてたわ。
やっぱりWindowsディスられてるじゃねーか!窓使いは◯ねと申すか!?
まぁ、これで一通りのパターンは対応できたはずだ。
多分、これでRuby on RailsでMySQLを使う際のエラーは出なくなっているだろう。
・・・出てたらゴメンネ(棒読)。
まぁ、願わくばエラー出てないこと前提で。次に実際にデータベースを作ってテストしてみる。
上記を踏まえてのデータベースとテーブルの作成
ここで大事なことだが・・・ここまで読んだってことはちゃんと「【アプリのディレクトリ】/Gemfiles」と「【アプリのディレクトリ】/config/database.yml」の設定は正確に終わってるよね?
「【Railsアプリのディレクトリ】」へGO。Railsアプリを実行している状態なら、一旦ダウンさせる。
で、以下のコマンドでデータベースの作成テスト。
rake db:create
これで、「【アプリのディレクトリ】/config/database.yml」で定義したデータベースがMySQLサーバー内に作成される。
コマンドラインのmysqlで確認するなりphpMyAdminなりで確認するなりで、データベースが作成できたことを確認する。
作成できてないならコマンド画面で何らかのエラー表示出てると思うけど。
んでもって、続いてテーブルの作成にいこうと思う。
ここまでできているのならSQLで直でテーブルを作成してもいいが、せっかくRailsを使っているのでModelの概念を使う。直でテーブルのSQL流し込みとか危険&ナンセンス。
以下のコマンドでまずはテーブルのModelを作成。(この辺はLaravelのときにも同じようなことやったなぁ・・・。)
rails generate model 【テーブル名】
これで、テーブルの構造を定義するためのrbファイルが「【アプリのディレクトリ】/db/migrate」に作成される。
rbファイルを開いたら以下のようなActiveRecord::Migrationを継承したクラスが確認できると思う。
class Create【テーブル名から生成されるクラス添字】 < ActiveRecord::Migration[5.1] def change create_table :【テーブル名】 do |t| t.timestamp end end end
これができたらchangeメソッドの「create_table :【テーブル名】 do |t|」~「end」の間にテーブルの構造を書いていく。
class Create【テーブル名から生成されるクラス添字】 < ActiveRecord::Migration[5.1] def change create_table :【テーブル名】 do |t| t.【データ型】:【カラム名】 t.【データ型】:【カラム名】 t.【データ型】:【カラム名】 end end end
みたいな感じで。
で、いよいよ出物のテーブルの実体を作成するためにマイグレーションのコマンドを実行!
rake db:migrate
これで「【アプリのディレクトリ】/config/database.yml」で指定したデータベースにテーブルが作成されるはず。
・・・とりあえずのところ、これでエラーの解決とデータベース作成~テーブル作成まではできていると思う。
まぁRuby on Railsの触り始めということで、とりあえず初歩の初歩としてはこんなところ。
あとはViewだとかControlerを駆使して、書き慣れたやり方でコマネチするだけ!
つーか、データベース関係で躓くと途端にやる気が失せてくるので、やっぱりこれって精神面でも大事だよな。
どう使って何を作るにしてもデータベースを使わないシステムなんて絶対にありえないし。