paizaラーニングでSinatraを学習中です。
進めていて疑問に思ったことを記録しておきます。
教材中で出てきたコードはそのまま使用できないので、少し改変しながら記録します。
statementって何?
# rubyでmysqlに接続する
require 'mysql2'
client = Mysql2::Client.new(:host => "localhost", :username => "user1", :database => "db1")
sql = "SELECT * FROM members"
statement = client.prepare(sql) #←このstatementって、何?
results = statement.execute()
results.each do |row|
p row
end
(該当:paiza_Webアプリ開発入門 Sinatra編3:Rubyでデータベースの基本を理解しよう_チャプター1)
↑この、「statement」って、何?
↓この2行でresults変数にSQLの結果を代入している様子だけど各コードの意味がわからない。
statement = client.prepare(sql)
results = statement.execute()
paizaの講義内では、以下のように解説されていた。
・require 'mysql2'
・・・まず、requireメソッドで、mysqlを操作するライブラリを読み込む。
・client = Mysql2::Client.new(:host => "localhost", :username => "root", :database => "mydb")
・・・DB接続のためのオブジェクトを生成。
「:host => "localhost"」:引数でオブジェクトサーバを指定して
「:username => "root"」:ユーザ名を指定して
「:database => "mydb"」:DB名を指定している。
・'sql = "SELECT * FROM players"
・・・sql変数にDBを操作するSQL文を記述。
・statement = client.prepare(sql)
・・・clientオブジェクトのprepareメソッドを呼び出して、DBを操作する準備をしている。(prepare=準備する)この時、引数でsql変数を指定する。
・results = statement.execute()
・・・最後に、statementオブジェクトのexecuteメソッドでSQLを実行している。DBに問い合わせた結果はresults変数に代入されているので
・results.each do |row|
・・・ループで1行ずつ取り出している!
・p row
・・・pメソッドでrow変数を出力
「clientオブジェクトのprepareメソッド」、「statementオブジェクトのexecuteメソッド」…。
そもそも、「オブジェクト」「メソッド」って何だっけ?
ここでの使われ方を見ていると、「関数」にも似ているような…。これらの違いは何なの?
調べてみます。「オブジェクト メソッド 関数」でググると、メソッドと関数の違いを解説してくれている記事が沢山出てきました。↓このように理解しました。
クラス・オブジェクト・メソッド・関数とは
・クラス
オブジェクトの設計図。雛形。データと処理手順をセットにしたもの。
・オブジェクト
クラスに値を入れたもの。クラスの実体。データと処理手順をセットにしたもの。
・メソッド
呼び出し側から受け取った引数を使って何らかの処理を行い、その結果を戻り値として呼び出し側に返す。クラスorオブジェクトに属している。
・関数
メソッドと同じく、呼び出し側から受け取った引数を使って何らかの処理を行い、その結果を戻り値として呼び出し側に返す。しかし、クラスorオブジェクトに属していない。(or属しているとは限らない?)
メソッドと関数については、↓こちらのフリーランス・社員に例えた解説が私にはわかりやすかったです。
ここで本題の「statement」です。
「statement = client.prepare」等でググりました。
参考:
gyhyo.jp_RubyからMySQLを操作してみる
プログラミングスクールおすすめラボ_【Rails】MySQLを動かす、queryとprepareメソッドの使い方
かもメモ_Ruby mysql2のメモ
ドンピシャの回答は見つからなかったものの、上記3記事含めて数記事読んでみて、↓こう理解しました。
statement~を解読
statementの前部分から順に解読していきます。
# rubyでmysqlに接続する
require 'mysql2'
(mysql2がインストールされている状態で)
require 'mysql2'
でmysql2を呼び出す。
client = Mysql2::Client.new(:host => "localhost", :username => "user1", :database => "db1")
MySQL2::Client
で、Mysql2のClientクラスを使ってmysql2に接続。
(Mysql2のClientクラスをインスタンスで生成する。)
引数にrubyのハッシュ値を渡すことで、接続情報を加えることができる。
自信なし:client =
でRubyのclientクラスを定義している、ということ?(定義の内容は接続情報)
ハッシュ(Hash)とは?
Hashは連想配列とも呼ばれ、配列に似た概念。配列と同じように複数の要素を格納するために使用する。配列が要素を指定するのに「0」から始まるインデックスを使用するのに対し、Hashはインデックスに「キー」と呼ばれる任意の文字列を指定して「バリュー」と呼ばれる要素を指定する。
参考:TECH PLAY_RubyのHashとは?Hashの概要と基本操作を解説
mysel2は、RubyプログラムからMySQLへアクセスするためのライブラリ。
MySQLは、OSSのRDBMS。
RDBMS に接続するためには、クライアントライブラリが必要。mysql2はそれ。
参考:jihyo.jp_RubyからMySQLを操作してみる
sql = "SELECT * FROM members"
statement = client.prepare(sql) #←このstatementって、何?
results = statement.execute()
自信なし:この「sql=」「statement = 」「results = 」は全部Ruby?
疑問:この「statement = 」「results =」は毎回使う文法なのか?あるいは、任意の文字を自分で定義しても良いのか?
→「stmt=」「res=」と書いてる人もいる。(例:かもメモ_Ruby mysql2のメモ )
任意の文字でOKそうだが、(確信持てる資料は見つけられなかったが)決まり文句であるらしい。
自信なし:「statement =」で先に定義したclientクラスのprepareメソッド(=実行したいSQL文を準備)を実行するプログラムを「statementクラス」だと定義している?
自信なし:「results = 」で先に定義したstatementクラスのececuteメソッド(=SQLを実行)を実行するプログラムを「resultsクラス」だと定義している?
results.each do |row|
p row
end
eachメソッドは配列や範囲オブジェクトで使用できるメソッド。オブジェクトに含まれる要素を順番に取得できる。「each do |変数|」で指定した変数に配列の要素を順番に格納する。
pメソッドはRubyの標準出力メソッドのひとつ。文字列は「”」で囲まれ、数字はそのまま出力され、末尾に改行が入る。
関係整理
●Webアプリケーション
あらゆるデータがクラウド上のデータベースに保存されている。
しかし、その状態だとデータベースの情報を参照したり、変更したりできるのは技術者だけ。
Webアプリケーションは、Webページ(HTML)をインターフェースにして非技術者でもデータベースにアクセスできる仕組み。
ユーザー → Chrome等のウェブブラウザ → クリック → クラウド → ウェブサーバー → アプリケーション サーバー → データベース サーバー
と進んで戻る。
(ユーザーからのクリック→HTML→Ruby→Sinatra→Erb→データベース)
●Sinatra
ポイント3プロセス=「URLの定義」「その中の処理」「HTMLに表示」。
●ERB
ERBは、HTML等のテキストにRubyのスクリプトを埋め込むためのライブラリ。
「view」ディレクトリに「〇〇〇.erb」ファイルを作成。
「〇〇〇.erb」ファイル=テンプレートファイル。
「〇〇〇.rb」ファイル内に
get '/' do
erb :〇〇〇
end
のように記述して使用。
●ActiveRecord
RailsにおけるORM(Object-Relational Mapping)の実装。データベース操作をRubyのコードで行え、データベースのテーブルとデータをRubyのオブジェクトとして扱えるようになる。データベースのテーブル(Table)とアプリケーション内のモデル(Model)を関連付ける。
教材
もらったアドバイスのメモ
・ユーザー → ERB → Sinatra → mysql2 → mysql
みたいに整理しておくと良い。しばらくは一番奥底がデータベースそのものだと思っててOK。
・ActiveRecordの場合は、こうなる
ユーザー → ERB → Sinatra → ActiveRecord → mysql or postgresql
・クラスに関しては結構奥深いので今の時点では、属性、カラム、そして処理等やをまとめる箱、もしくは設計図と認識しておく。設計図なので、一度作ったら、色んな箇所で同じふるまいをさせれるよねって考え方。
・mysql2、ActiveRecordも大きな枠で括ると、データベース クライアント。
Rubyから直接データベースを操作するよりインターフェースが統一されたデータベース クライアントを使うと簡単だよねって考え方。
・ActiveRecordは同じプログラミング文でもMySQLでもPostgresqlでも操作できるというメリットがあり、多くの現場ではこちらが利用されている。(しかし、多くの参考書ではいきなりActiveRecordの話に入るのでDBの学習をしていない人はつまづきやすい)