tiny_tdsを使ってRubyプログラムからMicrosoft SQL Serverを利用する
はじめに
RubyでWebアプリを開発する場合、RDBMSにはMySQL ServerやPostgreSQLを使うことが多いと思います。 しかし色々な事情でMicrosoft SQL Server(以下SQL Server)を使う場合も少なからずあるはずです。 今回はAmazon Linux上でSQL Serverを起動してRubyからSQLを実行してみました。
構成/今回やったこと
構成
- Amazon Linux AMI 2018.03.0.20180412 x86_64 HVM GP2
- Ruby 2.4.4 (rbenvでインストール済み)
- Docker version 17.12.1-ce (インストール済み)
やったこと
おおまかには下記の作業を行いました。
- gem tiny_tds を使ってRubyプログラムからSQLServerに接続しSQLを実行する
- freetdsをインストール(tiny_tdsのビルドに必要)
- tiny_tdsをインストール
- SQLServerはローカルのDocker(docker-compose)で起動する
- Dockerhubに公開されているmicrosoft/mssql-server-linuxを使用します。
freetdsのインストール
yum リポジトリのfreetdsはtiny_tdsが求める最低バージョン(0.95.80 or higher)より古い(v0.91)ため最新版をコードからビルドします。 ドキュメントの手順とほぼ同じです。 tiny_tdsのドキュメントを読んでも特別なconfigureは必要ないようなので素直にconfigureしてmakeします。
sudo yum install -y git-core zlib zlib-devel gcc-c++ patch readline readline-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-1.00.27.tar.gz tar -xzf freetds-1.00.27.tar.gz cd freetds-1.00.27 ./configure --prefix=/usr/local --with-tdsver=7.3 make make install
SQL Serverの起動
docker-compose.ymlファイルは下記のような感じでポート、EULAの承諾、パスワードを設定します。
version: '3' services: sqlserver: image: "microsoft/mssql-server-linux:latest" ports: - "1433:1433" environment: - ACCEPT_EULA=Y - SA_PASSWORD=yourStrong(!)Password
テスト用のコード
実際はrailsなどから利用するので自前でコネクションを生成してSQL実行をすることはないのですが、動作確認のために以下のコードを準備しました。
# frozen_string_literal: true # get_time.sql require 'tiny_tds' begin client = TinyTds::Client.new username: 'sa', password: 'yourStrong(!)Password', host: 'localhost' sql = client.escape('select GETDATE()') result = client.execute(sql) result.each do |row| p row end ensure client.close if client&.active? end
実行結果
$ bundle exec ruby get_time.sql {""=>2018-04-24 08:41:01 +0000}
簡単なコードでしたがSQL実行できました。
まとめ
Amazon Linux上でSQLServerへ接続するRubyプログラムを実行することができました。