active record めんどくさいし
めんどうだし、遅いんですよ。SQLわかってれば、ActiveRecordってメッド生やすの面倒だし、オブジェクト作ったり手続きが面倒だったんで。
ruby で mysql2 を使ったアクセス
BestGem でダウンロード数を比較したらhttp://bestgems.org/search?q=mysql mysql2 がトリプルスコアで圧倒的だったので。これを使うことにした。
gem install mysql2
mysql2 の利用
使い方は、大変シンプル
- client(connection)
- Statement
- Result
という王道の三本セット
require 'mysql2' client = Mysql2::Client.new(host:"192.168.2.5", username:"takuya", password: "*********", database:"my_Db") ret = client.query("select * from sample order by id desc limit 10 "); ret.each{|row | p row }
mysql2 で prepare ステートメント
mysql2公式に載ってた。
statement = @client.prepare("SELECT * FROM users WHERE login_count = ?") result1 = statement.execute(1) result2 = statement.execute(2)
名前付きbindをするのは、無理そう
トランザクション
自分で管理。
client.query("begin"); client.query("select * from sample order by id desc limit 10 "); client.query("commit");
潔くていいし、低レベルレイヤなのでわかりやすいっすね。
sequel を使ってもう少しだけ抽象化
ruby のDBアクセスで、もう一つの定番はSequel
sequel はバックエンドにMysql2
を使える。いいね。
sequel 使うなら、ActiveRecord使えばいんだろうけどさ、rails 関連ってググラビリティの性能が悪いので、あまり好きじゃない。php 波にカオス。
gem install sequel
基本的な使いかた
require 'sequel' require 'logger' db = Sequel.connect('mysql2://takuya:**pass**@192.168.100.1/takuya_db',:loggers => [Logger.new($stdout)]) res = db[:tablename] res.each{|e| p e }
ポイントは、 eachで回すまでクエリを発行しないところ。
sequel でトランザクション
トランザクションは、ブロックを渡す。これRubyっぽい。気に入った
db = Sequel.connect('mysql2://takuya:**pass**@192.168.100.1/takuya_db',:loggers => [Logger.new($stdout)]) db.transaction do table = db[:address] names.each{|e| table.insert(e) } end
insert ・ update はハッシュ値で指定できて便利
データを突っ込むときは、ハッシュ値ベースで放り込めるので、オブジェクトあれば便利なんだろうけど、とりあえずファイルの値をつっこみたいとか、手作業でぱぱっと入れたいとかそういう時にすごく重宝するわこれ。
sequel で prepare
そのうち調べる。
ちょっと面倒なんだけどね。ハッシュのキーとバリューがあればできる。