Ruby on Railsを基礎から学ぶ 第6回
〜Railsコンソールからのデータ投入とシードデータ〜
前回、マイグレーションにより、memberテーブルを作成しました。
これからこの会員用テーブルを使用して、会員用SNS風を作っていくわけですが、キーボードからコマンドを打って、データの登録・更新を行うのは、WindowsなどGUI馴れしている私たちにしてみると、ちょっと心もとないです。
そこで、今回は、まずDBのGUIを使用して、実際に前回作成したテーブルを覗いてみて、それからrailsコマンドでデータ更新をしていくという流れで行きましょう。
では、始めます。
1.DBのGUIから作成したテーブルを見てみる
まずここで、断っておかなければいけないのは、このサイトでは当面DBはPostgreSQLを使用していくという点です。
MySQLなども後々手順を公開していきますが、しばらくはPostgreSQLでやります。
PostgreSQL DBはインストール時に一緒にpgAdminというGUIもインストールしてくれます。
万が一、導入されていない場合は、非常に単純な手順ですので、下記のサイトを参考にインストールしてみてください。
◆インストール支援サイト
lets.postgresql
PostgreSQLの導入と初期設定
http://lets.postgresql.jp/documents/tutorial/introduction/
直接ダウンロー^ドの場合は↓
pgAdmin Windows
http://www.pgadmin.org/download/windows.php
この中にある
?pgAdmin v1.16.1
をダウンロードしました。(情報は2013/5/20現在のものです。
もっと新しいのが出てる場合それでも良いです。)
こちらをインストールしてください。
ほとんど、Nextで行けます。
2.pgAdmin Vの使い方(画面説明)
Pgadminは、Windowsのスタートメニューからプログラム→PostgreSQL x.x→pgadmin V
と進んでください。
下のような画面が出ています。
初めは赤枠のあたりは表示されていません。そこで、赤丸(PostgreSQL x.x)をダブルクリックします。
DBユーザのパスワードが聞かれます。
使用するユーザのパスワードを入力してください。
忘れてしまった人は、コマンドプロンプトからユーザ情報を確認します。→こちら
これで、さっきの画面のようにたくさんブレイクダウンされた情報が出てきます。
赤線のように、memberというテーブルがあります。これこそ前回作成したmemberテーブルなのです。
3.railsコンソールからのレコード追加・更新
では、このpgadminで確認できたテーブルが本当にrailsと連動しているか、
もう少し確認してみましょう。
まず、rubyコマンドプロンプト上で、以下のコマンドを実行します。
>rails c
これは、rails consoleでもよいです。
まあrailsのコンソールを開くということですね。
次に、あがってきたコンソール(コマンドラインは00:0>のような行番号で示される)
member = Member.new
これは、変数memberにMemberモデルをnewしてできたインスタンスをセットしているのです。
Memberとmemberの大文字小文字の違いに良く注意!
このmember = Member.(メソッド)の書き方はこれから非常に良く使っていきますし、解説サイトでも良く使われます。
しっかり理解してください。
次にmemberの会員番号(ギルドナンバーと称しているが…)であるnumberに1をセットします。
member.number = 1
これは、先ほど作ったMemberモデルのインスタンスmemberの一つ目の項目(列)numberに1をセットするという意味です。
ちなみにこの状態ではまだDBのテーブルには登録されていません。
次のコマンドで実行するmember.saveでようやく登録となります。
少しメッセージが出た後、trueという戻り値が見えます。
これはsaveがtrue正常に終わったことを示します。
このtrue またはfalseが今後の画面更新などの分岐条件にしばしば使用されます。
ここもぜひとも見ておいてください。
コンソールの標準出力を貼り付けておきます。
C:\test_apl>rails c Loading
development environment (Rails 4.0.0.rc1) irb(main):001:0> member = Member.new => #<Member
id: nil, number: nil, name: nil, full_name: nil, email: nil, birthda 0, administrator: false, created_at:
nil, updated_at: nil, phone: nil> irb(main):002:0>
member.number = 1 => 1 irb(main):003:0>
member.name = "Thomas" =>
"Thomas" irb(main):004:0>
member.save [1m[36m (0.0ms)[0m [1mBEGIN[0m [1m[35mSQL (1812.5ms)[0m INSERT INTO "members"
("created_at", "name", "num at")
VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", Wed, 15 May
2013 07 00],
["name", "Thomas"], ["number", 1],
["updated_at", Wed, 15 May 2013 07:18:31 [1m[36m (78.1ms)[0m [1mCOMMIT[0m => true irb(main):005:0>
exit |
ここまででいくつか使用したコマンドがありましたが、これはrubyのソースコードをじかに実行しているのです。
今後DBを使用したコーディングを行う際に、たとえばmemberのnumberだけ変更したいとなれば、
上述のコードがそのまま使用できます。
どうせpgadminでテーブルの中身いじれるだろうと高を括らず、覚えましょう。
さて、pgadminで確認してみます。
おそらくpgadminは閉じていないと思うので、見てみましょう。
下のように。Memberテーブルで右クリック→データ→先頭100行の表示と進みます。
こんなかんじです。
どうです。さっきのレコードだったでしょう。
ここで、ポイントとなるのは、memberテーブルには、管理者権限(administrator)が必須だったはずですが、
これはfalseとなっています。
前回のテーブル作成時に、管理者権限は初期値でfalseとしているので、自動的にセットされているのです。
そのため、numberとnameの2つをセットしておけば、レコードとして成立します。
仮に、numberだけセットして、nameをいれないでmember.save(登録)しようとすると、怒られます。
4.シードを利用したレコード追加
Dbをcreateしたときに、以下のフォルダにシードデータ用のrbファイルが作成されていることに気付きます。
C:\test_apl\db
seeds.rb
# This file
should contain all the record creation needed to seed the database with its
default values. # The data
can then be loaded with the rake db:seed (or created alongside the db with
db:setup). # # Examples: # # cities = City.create([{ name: ' # Mayor.create(name: 'Emanuel',
city: cities.first) |
中身を見ると、コメントしか書かれていませんが、
ここに元となるデータ(初期投入データ)をrailsで記述できるようになっているわけです。
今回は、参考文献のオイアクス製の簡易エータ作成コードを引用します。
table_names
= %w(members) table_names.each
do |table_name| path = Rails.root.join("db/seeds",
Rails.env, table_name + ".rb") if File.exist?(path) puts "Creating
#{table_name}..." require path end end |
これは、dbフォルダの下のseedsフォルダに、モデル名と同じrbファイルがあれば
それを実行し、テーブルに投入する流れとなっています。
以下のように、members.rbというファイルを作ります。
C:\test_apl\db\seeds\development
members.rb
# coding:
utf-8 names =
%w(Taro Jiro Hana John Mike Sophy Bill Alex Mary Tom) fnames =
["佐藤",
"鈴木", "高橋",
"田中"] gnames =
["太郎",
"次郎", "花子"] 0.upto(9)
do |idx| Member.create(number: idx + 10, name: names[idx], full_name:
"#{fnames[idx % 4]} #{gnames[idx % 3]}", email:
"#{names[idx]}@example.com", birthday:
"1981-12-01", gender: [0, 0, 1][idx %
3], administrator: (idx == 0) ) end |
いくつかの姓名の素とデフォルトのありうる値を使って、
たすきにかけるようにバリエーションを作って10レコード分ユニーク(単一)なデータを作っているものです。
シードは実際はもう少し具体的な例を入れていくのですが、テストデータ作成としてはありな方法だと思います。
この状態で、rubyコマンドプロンプトで以下のrakeタスクを実行します。
Ruvyコマンドプロンプト
C:\test_apl>rake db:seed Creating members... |
実際のシードデータは、おそらく、CSVファイル入力とフォーマット変換、バリデートチェックなどをrubyで行い、
DBにつ込むという移行的なしっかりとしたものを作るものと思われます。
住所マスタや、ユーザさんの部署テーブル、権限テーブル。特にユーザ参照先が複雑なデシジョンテーブルになるような場合、
いくつかのプログラムを組み合わせるといった場合も出てくるでしょう。
これら移行手順については、このサイトでは触れません。
また機会があれば、どこかで話したいと思います。
5.pgAdminのビューで確認する
また、pgAdminでグラフィカルに確認します。
ちなみに下記のように、修正したいカラム(セル)でダブルクリックすると編集できます。
ここでは、「高橋 花子」を「高橋 花」にしました。
「花」という最近っぽい名前になりました。
工事中.PostgreSQLへのインポート
初期データはなれないうちは、railsで入れるのは大変でしょうから、CSVなどでいれられるとよいですよね。
このあたりにpgAdminのインポートも追加したいですね。(お待ちください。)
なんか説明するまでもなさそうな感じなんで、CSVなどでテストデータ作って、やってみてください ←おい!
おまけ.マイグレーションのし忘れメッセージ
マイグレーションをし忘れると、こんなメッセージが出ます。
念のため、掲載します。
C:\test_apl>rake
db:seed
You have 1
pending migration:
20130515021824 HogehogeMembers
Run `rake
db:migrate` to update your database then try again.
もし、し忘れがあったら、マイグレーションも実行します。
前回説明したし忘れを検地するrakeコマンドもあわせて確認してください。
ということで、おしまいです。
次回は、検索とrailsコンソールからのSQLの発行のしかたをやります。
C:\test_apl>rake
db:version
Current
version: 20130515013616
C:\test_apl>rake
db:abort_if_pending_migrations
You have 1
pending migration:
20130515021824 HogehogeMembers
Run `rake
db:migrate` to update your database then try again.
■ 参考テキスト■
サ改定新版 基礎 Ruby on Rails オイアクス監修 インプレスジャパン
■ 参考サイト■
PostgreSQLの導入と初期設定
http://lets.postgresql.jp/documents/tutorial/introduction/
pgAdmin Windows
http://www.pgadmin.org/download/windows.php
Raccoon's homepage Copyright
(C) 2000-2013 あらいベアー