Ruby on Rails on SQL Server 2005

メモ書き(まだ、完全に動かしてないので、まだ修正が必要なところはあるかも)

database.yml

development:
  adapter: sqlserver
  database: test_development
  username: sa
  password: root
  host: localhost
  provider: SQLNCLI
  encoding: utf8
  autocommit: false

sqlserver_adapter.rb

      def tables(name = nil)
        execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'", name).inject([]) do |tables, field|
          table_name = field[0]
          tables << table_name unless table_name == 'dtproperties' || table_name == 'sysdiagrams'
          tables
        end
      end

その他

テーブルにPKが付いてないと、migration時にエラー。そういえば、某Rails本にはまだmysqlくらいしかmigration対応してないと書いてあったが、すでにSQL Serverも対応しているっぽい。

[追記] SQL Serverにも対応自体はしているのだが、rake db:migrateの際にはautocommitをtrueにしないとテーブルが作られない。どうもMySQLではtransaction中にcreate文などが含められない関係で、こうなっているらしい。というわけで、migrate時には、database.ymlのautocommitを変更してから行う必要があるようだ。

[さらに追記] なぜか、SQL Serverから送られてくる文字列がSHIFT_JISだ。DBIまでいじらないとどうにもならなかったりするのだろうか。困った。

[2006/06/12 追記]
よくよくソースを追ってみると、database.ymlに書いてあるproviderが無視されている。sqlserver_adapter.rbの該当部分に修正を加え、WIN32OLE.codepage = WIN32OLE::CP_UTF8 を指定するとなんとかなりそうだが、時間が足りず未検証。なぜかエラーメッセージの一部だけがSHIFT_JISで送られてくるという問題だけは認識。でもたぶんこれはSQLServerのバグだろうなぁ。