tiny_tdsを使ってRubyプログラムからMicrosoft SQL Serverを利用する

Amazon Linux上で動作するRubyのプログラムからMicrosoft SQL Server上でSQLを実行するための環境構築とサンプルコードを作成しました。
2018.04.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

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)で起動する

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プログラムを実行することができました。