2012年12月6日木曜日

既存データベース(SQL Server)をRailsに載せる

ごめんなさい、ちょっと長すぎて、途中で何を言っているかわからなくなった気がする...でも一応個人の作業メモということで...お許し下さい..orz

環境はwindows
Ruby on Rails(RoR)は「railsinstaller.org」からdownload

$ ruby --version
ruby 1.9.3p125 (2012-02-16) [i386-mingw32]
$ rails --version
Rails 3.2.1
$ gem --version
1.8.16
$ gem list
*** LOCAL GEMS ***
actionmailer (3.2.1)
actionpack (3.2.1)
activemodel (3.2.9, 3.2.1)
activerecord (3.2.1)
activerecord-sqlserver-adapter (3.2.10, 3.2.1)
...
...

VersionやGemの一覧(初期ではない、あとからGEMで追加したものもある!)
インストール後、デフォルト「c:\Sites」が作成される
※もしOS上既にRubyがインストールしていれば、複数バージョンを管理するために,pikをススメます
参照 http://holypp.hatenablog.com/entry/20110407/1302193459

$ gem install pik


さて、プロジェクトを建てましょう

$ rails new railsinstaller_demo
$ cd railsinstaller_demo


今回は、既存のデータベースを使って、RoRに乗り換える。DBはSQL Server
Rails3からはプロジェクト単位でGEMを管理するから、プロジェクトフォルダ直下のGemfileに追加

gem 'activerecord-sqlserver-adapter'
gem 'tiny_tds'

そしたら、実行

$ rail bundle install


次はDBに接続
config/database.ymlを編集

development:
adapter: sqlserver
database: DB_NAME
host: 192.168.1.XXX
username: user
password: pwd


migrate←この段階では必要ないかもしれr内が、まぁ私はやった

$ rake db:migrate


ここまで来て、次はscaffold。だけど既存のDBのテーブルにはid列もないし、テーブル名はRailsの複数形式に従っていないが、ここ参照しました。本当にたすかったよ!
例えば今回scaffoldしたいテーブル名は「CounterParty」

$ rails console

irbコンソールが表示されたら、下記コードを全部(テーブル名は変更してね)コピペ
name = 'CounterParty'
si_table_name = 'CounterParty'
si_field_names = Array.new
si_cols = ActiveRecord::Base.connection.columns(si_table_name,"#{name} Columns")
si_cols.each do |c|
si_field_names << "#{c.name}:#{c.type}"
end
puts si_field_names.join(' ')
putsされたのは既存「CounterPartyのテーブル構造」、それをコピして、一旦railsコンソールをexit $ rails g scaffold CounterParty コピーした内容をここにペスト Another migration is already named create_counter_parties:... あれ、作成できない、既にある?なるほど、これはさきmigrateが悪かったね、しなければ良かったかも skip-migrateオプションを追加してもう一回 $ rails g scaffold CounterParty コピーした内容をここにペスト --skip-migrate Overwriteと聞かれたら「Y」 ... .. そしてCOunterPartyのScaffoldが作成されました。 しかし、DBの構造はRailsに乗ってないので、いま表示したらエラーになりますので app\models\counter_party.rbを編集して、テーブル名とid列を指定
class CounterParty < ActiveRecord::Base
 attr_accessible :CPName, :CPMemo, ... #Rails3からはwrite可能なフィルドを明示的に宣言しないといけないらしい?
 self.table_name = 'CounterParty'
 self.primary_key = :CPCPID
end
これでOKのはず、さあ見てみよ $ rails s ブラウザーで「http://localhost:3000/counter_parties」をいれてご― 表示されたかな? 続き、WindowServer2008で動かす >ruby --version ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] >rails --version Rails 2.1.1 >gem --version 0.9.4 だいぶ古いですね Rails3とRails2はいろいろ変わったので、ソースコードはそのまま移して使えないので、プロジェクトを新規作成する。 プロジェクト作成 database.ymlを編集 mongrelで動かすので、サービスとして登録します。 プロジェクトフォルダーの下で、「cmd」というフォルダーを作成して、下記のbatファイルを作成する mongrel_service_regist.bat CD ../ CALL mongrel_rails service::install -N "Mongrel 9500 MyProj" -p 9500 -e development -a 0.0.0.0 SC CONFIG "Mongrel 9500 MyProj" START= AUTO 9500はポート番号、他の空いているポートもOK mongrel_service_remove.bat mongrel_rails service::remove -N "Mongrel 9500 MyProj" mongrel_service_restart.bat NET STOP "Mongrel 9500 MyProj" NET START "Mongrel 9500 MyProj" mongrel_service_start.bat NET START "Mongrel 9500 MyProj" mongrel_service_stop.bat NET STOP "Mongrel 9500 MyProj" これで、サービス登録[自動に設定]、再起動、開始、停止などがOne Clickでできるようになる ※但し、これは「管理者:コマンドプロンプト」で実行しなければなりません。 SQL Serverを使っている、データベースの日本語がviewで文字化けている時。 RoRのソースコードはすべてUTF8で記載、SQLServerのencodeはsjisの場合に発生?と思う config/environment.rbの先頭で、下記を追加すれば解消された。
$KCODE = "u"
require "win32ole"
WIN32OLE.codepage=WIN32OLE::CP_UTF8
最後、既存DBを使っているので、既存のprimary key列「CPCPID」(AUTO_INCREMENT利用しない)をrailsで管理する。 sql server では「IDENTITY」という属性らしい。「開始番号」の「IDENTITYシード」と「ID増分」がある 例えばIDENTITYシード=100、ID増分=10なら、「100,110,120」みたいに自動IDを生成してくれる。 Microsoft SQL Server Management Studio(長っ!)オブジェクトエクスプローラでテーブルの「デザイン」を開き、右クリックで「列のプロパティ」でIDENTITYを設定することが可能です。 もしなんか「一旦削除しないといけない」的なメッセージで怒られたら、 「ツール」>「オプション」>「デザイナ」>「デーブルデザイナおよび...」>「テーブルの再作成を必要とする変更.....」のチェックを外せば、変更できると思います。 それが終わったら、moduleでid列として、newとeditから削除すれば、普通にidとしてrailsが管理更新してくれます。
self.primary_key = :CPCPID

長すぎで自分も嫌になりました、よしっ!以上!ヽ(´ー`)ノ フッ

0 件のコメント:

コメントを投稿