Rails MySQLを使用するアプリケーションでMSSQLServreにも接続する

カオスじゃないかこれは

前提条件

  • 新アプリケーションではRails + MySQLを使用する。
  • 既存のアプリケーションはSQLServreを使用している。
  • SQLServreはWindowsServerに配置されている。

実現したいこと

新アプリケーションで登録があった場合、
新アプリケーションDB・既存アプリケーションDB共に更新する。

実装

SQLServerを使うためのgemを導入する

# SQLServer用
gem 'tiny_tds'
gem 'activerecord-sqlserver-adapter'

そしていつもの

$ bundle install

しかしこれはエラーとなる。
tiny_tdsを使用するにはFreeTDSが必要。

$ brew install freetds
# または
$ yum install freetds freetds-devel

そのあとに

$ bundle install

これでgemの導入は完了。

SQLServreの情報をセット

database.ymlにSQLServreの情報をセットする。

# ここら辺はMySQL用の設定
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: [username]
password: [password]
host: [host]
development:
<<: *default
database: management_development
test:
<<: *default
database: management_test
production:
<<: *default
database: management_production
username: management
password: <%= ENV['DATABASE_PASSWORD'] %>
# 以下を追加
# MSSQLサーバー用
sqlserver:
adapter: sqlserver
host: [host]
database: [database]
port: [port]
username: [username]
password: [password]

Modelの作成

SQLを実行するだけの機能を実装。
ApplicationRecordは継承しない。

# MSSQLServerにつなぐもの
class Msss
# SQL文を実行する
def self.exec(sql)
sscnf = Rails.configuration.database_configuration['sqlserver']
client = TinyTds::Client.new(
adapter: sscnf['adapter'],
host: sscnf['host'],
database: sscnf['database'],
port: sscnf['port'],
username: sscnf['username'],
password: sscnf['password']
)
client.execute(sql)
end
end

使用例

単純なSELECT文を実行し、その結果を取得する例

class TestController < ApplicationController
def test
result = Msss.exec("SELECT * FROM [list] ")
result.each do |row|
puts row["name"]
end
render :text => "text"
end
end

もちろんUPDATEやINSERTも可能。

参考にさせていただいたサイト

Rails3でSQLServerに接続してみたよ
[Rails][AzureSQLデータベース]Macでtiny_tdsのbundle installが通らない時の対処法