🐡

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

2023/09/14に公開

カオスじゃないかこれは

前提条件

  • 新アプリケーションでは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