Rails6の学習環境を構築
Rails6 の小さなプロジェクトをつくり、いろいろ試していくことにします。
まず Rails6 のプロジェクトを rails new で作成します。そのプロジェクトで、DB内容の csv エクスポート・インポートの処理をいくつか実装して処理速度を比較していきます。
(実際のプロジェクトコードは https://github.com/katoy/rail6-with_rspec で参照できます)
この記事では作業前の環境準備について述べます。
1. Rspec の導入
rails6では、minitestというテストフレームワークが標準です。(Railsチュートリアルでも mnitest でテストをしています)
しかし、このプロジェクトでは rspec というフレームワークを使うようにします。
理由は私がRails のテストについては書籍 “Everyday Rails – RSpecによるRailsテスト入門” で勉強したことがあり、rspec に慣れているからです。
ここでは、設定のこまかな手順は省略します。
【動画付き】Everyday RailsのサンプルアプリをRails 6で動かす際に必要なテストコードの変更点
など、web 上で Rails6 環境のテストを rspec で行うための設定方法がいろいろ見つかります。
ご自分で rails new からプロジェクトを作っていく際は、これらを参照しながら作業することをお勧めします。
githbu においたプロジェクトコード https://github.com/katoy/rail6-with_rspec は、rails6 で rails new してから rspec を導入した環境になっています。github から clone すれば、rspec が PASS する状態になっているはずです。
なお、このプロジェクトでは、 DB には MySQLを使っています。mysql サーバーをインストール/稼働させた状態で DB 構築をしてから、rspec を走らせる必要があります。
DB構築と rspec の実行
2. DBのGUIクライアントの導入
DB の内容を確認したり、SQL文を実行して結果を確認するといった操作をするために、GUI クライアントツールがあると便利です。
私は DBevar というツールをつかっています。主なDB (MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, etc) に対応しています。Mac の場合は brew cask install dbeaver-community でインストールできます。
(DBeaver のホームページから 各種 OS 甩のインストーラを取得することもできます)
下に このプロジェクトの DB (MySQL) についてテーブルの内容表示、ER 図表示、SQL実行の様子を示します。
テーブル内容の表示
簡易 ER 図の表示
SQL文の実行
3. ER図の自動作成
ER図の表示が DBeaver である程度できます。もっと複雑。大量のテーブルのER図を生成するなら、専用の別ツールがあります。
私は ER図の作成には、schemaspy を使っています。このプロジェクトでは、schempy で ER図を作る設定をしてあります。
$ cd schemaspy
$ ,.run/sh
を実行すると ./html 以下に DB 全体の ER 図が生成されます。 html/index.html をブラウザで開くと閲覧できます。
この図は svg 形式で生成するように設定してあります。svg 形式なので、ブラウザで拡大・縮小表示をしていっても字や線が潰れたり粗いドット表示になることはありません。もっと複雑で、テーブル数・カラム数が多くて拡大・縮小表示する必要がある場合でも綺麗に表示されます。
4. DB の store/restore
100万件。1000 万件のデータを保持させたDBをつくるのはそれなりに時間がかかります。一度つくったDB は dumo ファイルを store してき、必要に応じて dump ファイルを restore するようにすると便利です。store / restore の操作はコマンドライン操作で可能ですが、タイプミスを防ぐために、rails の rake task をつくりました。
$ rails db:dump を実行すると development 環境の DB の dump が ./tmp/rail6-with_rspec_development.dump に保存されます。
$ rails db:restore を実行すると、 ./tmp/rail6-with_rspec_development.dump が develop 環境の DB に restore されます。
5. ベンチマーク方法
エクスポートでは、DBに1千万件のデータを作っておきます。その状態で 1万件。10万件, …を csv としてエクスポートするメソッドを呼び出して実行時間とメモリー使用量を測定します。
インポートでは、DBに1千万件のデータを作っておきます。さらに 1万件、10万件, … のデータ行を持つ csv ファイルを作成しておきます。その状態で インポートするメソッドを 読み込む csv ファイルを指定して実行時間とメモリー使用量を測定します。
これらの操作についても rake task を作りました。
1000 件レベルの DB 作成 (アニメーションgif)
10000件ていどなら、処理時間は数銃秒ですが、100万件、1千万件の場合は数分かかります。作業の進行状態がわかりようにプログレスバー表示する工夫をしています。
次回は、実際に csv エクスポートの処理を複数実装してから、それらの処理時間・使用メモリー量を比較していきます。