🐡
Rails MySQLを使用するアプリケーションでMSSQLServreにも接続する
カオスじゃないかこれは
前提条件
- 新アプリケーションではRails + MySQLを使用する。
- 既存のアプリケーションはSQLServreを使用している。
- SQLServreはWindowsServerに配置されている。
実現したいこと
新アプリケーションで登録があった場合、
新アプリケーションDB・既存アプリケーションDB共に更新する。
実装
SQLServerを使うためのgemを導入する
Gemfile
# 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の情報をセットする。
database.yml
# ここら辺は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は継承しない。
msss.rb
# 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文を実行し、その結果を取得する例
testcontroller.rb
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が通らない時の対処法
Discussion