ActiveRecordを単体で使うには
さくっとDBにアクセスするバッチやスクリプトを、rubyで書きたいなぁと思うことはないですか? Railsで使われている O/Rマッピングのライブラリ「ActiveRecord」ですが、Railsではなくただのrubyプログラムから単体で使うことが出来ます。
今回は、「ActiveRecord」を単体で使用して、MySQLにアクセスするスクリプトを書いてみます。
環境
- ruby 1.9.3
- activerecord 3.2.8
ActiveRecordを使ってみる
-
ActiveRecordをインストール
$ gem install activerecord
-
MySQLに接続するためのアダプタインストール
$ gem install mysql2
下のようなエラーが出る場合、
Building native extensions. This could take a while... ERROR: Error installing mysql2: ERROR: Failed to build gem native extension. /home/tsuchikazu/.rbenv/versions/1.9.3-p286/bin/ruby extconf.rb checking for rb_thread_blocking_region()... yes checking for rb_wait_for_single_fd()... yes checking for mysql.h... no checking for mysql/mysql.h... no
MySQL開発用のライブラリである、mysql-develをインストールしなければなりません。
$ sudo yum info mysql-devel
-
まず、最初はハードコーディングしてみます
main.rb
# -*- encoding: utf-8 -*- require "rubygems" require "active_record" # DB接続設定 ActiveRecord::Base.establish_connection( adapter: "mysql2", host: "localhost", username: "xxxxxx", password: "xxxxxxx", database: "xxxxxx", ) # テーブルにアクセスするためのクラスを宣言 class User < ActiveRecord::Base # テーブル名が命名規則に沿わない場合、 self.table_name = 'wp_users' # set_table_nameは古いから注意 end # レコード取得 p User.all
-
本番環境や、テスト環境など簡単にDB接続設定を簡単に切り替え出来るように、YAMLに外出ししてみましょう
database.yml
db: production: adapter: mysql2 host: localhost username: xxxxxxxx password: xxxxxxxx database: xxxxxxxx development: adapter: mysql2 host: localhost username: xxxxxxxx password: xxxxxxxx database: xxxxxxxx database: xxxxxx
修正したmain.rb
# -*- encoding: utf-8 -*- require "rubygems" require "active_record" config = YAML.load_file( './database.yml' ) # 環境を切り替える ActiveRecord::Base.establish_connection(config["db"]["development"]) # テーブルにアクセスするためのクラスを宣言 class User < ActiveRecord::Base # テーブル名が命名規則に沿わない場合、 self.table_name = 'wp_users' # set_table_nameは古いから注意 end # レコード取得 p User.all
config["db"]["development"]
の部分は、Railsと同様に管理するなら環境変数に入れてconfig["db"][ENV["RAILS_ENV"]]
こんな感じにするのもいいかもしれません。
こんな感じで、簡単にrubyでDBアクセス出来ますね。ActiveRecordは色々APIもあるし便利です。既存アプリは他の言語で書かれているけど、小さなところから徐々にruby化したい。っていう時とかにもいいかもしれません。