既存のDBをActiveRecordを使ったrubyスクリプトで操作する
すごく久しぶりに書く技術ブログ…前回は去年の8月かぁ(遠い目…
今回は既存のDBの中味を ActiveRecord gem で操作するときの手順などを書いてみたいと思います。ActiveRecord のバージョンは 4.1.8 です。
環境構築
DB接続情報
まずは接続情報をYAMLで用意しておきましょう。別にスクリプト中に直接書いてもかまいませんが、YAMLで別ファイルにしておくと複数接続先を切り替えたいときに便利です。
database.yml
db: local: adapter: mysql2 host: localhost username: sample_user password: samplesample database: sample_db
スクリプト
実際のスクリプトは下記のようになります。
test.rb
require 'active_record' require 'yaml' #DB接続情報を読み込み conf = YAML.load_file('./database.yml') #接続情報を渡しDBへ接続する ActiveRecord::Base.establish_connection(conf['db']['local']) # ユーザモデルを定義 class User < ActiveRecord::Base # 使用するテーブル名を指定 # テーブル名がActiveRecordの命名規約に沿っていない場合のみ self.table_name = 'user' end # 全ユーザを出力 p User.all
既存カラム名がActiveRecordの予約語とバッティングした場合の対処
スクリプトも書けて、さぁバリバリ操作しようと意気揚々と実行させたら…下記のようなエラーメッセージが…
`instance_method_already_implemented?': hash is defined by Active Record. Check to make sure that you don't have an attribute or method with the same name. (ActiveRecord::DangerousAttributeError)
既存DBのカラム名の中にActiveRecordの予約語とバッティングするものがあったため例外が発生しています。(この場合は hash というカラム名が問題ですね)
このような場合はカラム名を変更するのがベストなんですが、既存DBのためそれも困難…
しかしこれに対処するための safe_attributes というgemが存在します。
そのgemを使用したサンプルコート
require 'active_record' require 'safe_attributes/base' require 'yaml' #DB接続情報を読み込み conf = YAML.load_file('./database.yml') #接続情報を渡しDBへ接続する ActiveRecord::Base.establish_connection(conf['db']['local']) # ユーザモデルを定義 class User < ActiveRecord::Base # SafeAttributesをinclude include SafeAttributes::Base # 予約語と重複しているカラム名を指定 bad_attribute_names :hash # 使用するテーブル名を指定 # テーブル名がActiveRecordの命名規約に沿っていない場合のみ self.table_name = 'user' end # 全ユーザを出力 p User.all
これでバッチリ回避できました!