RubyアプリケーションからSQL Azureへ接続する(ja-JP)

表示言語を変更するにはここをクリックしてください (English)。 

この記事は、RubyからSQL Azureに接続する方法を説明します。この記事では、SQL Azureへの接続に使用できるいくつかのgemを説明しますが、SQL Azureへの接続に使用できるすべてのgemを網羅したものではありません。

メモ:この記事で紹介している手順は、編集方法の違いやODBCドライバーの利用方法が原因で、すべてのOSに当てはまるものではありません。今のところ、この記事で説明している内容は、Windows 7とWindows Azure Webもしくはworker roleのホスティング環境を対象としています。


初期準備

この記事では、Rubyに詳しいことを前提としています。また、以下の環境を前提としています。

  • Ruby 1.8.7, or 1.9.2
  • Windows Azure Platform サブスクリプション
  • SQL Azure データベース
    • すべてのクライアントIPから接続できるようにファイヤーウォールを設定します。

メモ:Rubyについて詳細情報は、http://www.ruby-lang.org/を参照してください。Windows Azure Platformの詳細、特にSQL Azureの基礎情報についてはhttp://social.technet.microsoft.com/wiki/contents/articles/getting-started-with-the-sql-azure-database.aspxを参照してください。

Rubyからデータベースへの接続

SQL Azureへの接続の為に、Ruby ODBC、TinyTDS、Ruby [[OData]] gemを使用します。Ruby用に提供されている他のデータベースへの接続方法もありますが、提供されているすべての接続方法でSQL Azureに接続できるわけではありません。

以下のコマンドを実行することで、gemコマンド(http://docs.rubygems.org/read/book/2)を使用して、3つのgemをインストールすることができます。

gem install ruby-odbc
gem install tiny_tds
gem install ruby_odata

注意:SQL Azureに対応したパッケージのインストール方法については、TinyTDSの使用を参照してください。

Ruby ODBCの使用

Ruby ODBC は、SQL Azureを含んむODBCデータソースへの接続を可能にします。このgemを用いてSQL AzureデータベースにODBC接続できるかを最初に確認します。次の手順で、ODBCの設定と接続テストをします。

Windows 7上のODBC設定

  1. スタートメニューの検索欄に ‘ODBC’ と入力します。 **データソース (ODBC)**プログラムが表示されます。それを選択します。
  2. データソースプログラムで、 ユーザー DSNタブを選択し、追加をクリックします。
  3. SQL Server Native Client 10.0を選択し、 完了をクリックします。
  4. DSN名を入力し、SQL AzureデータベースDNSを入力し 次へをクリックします。
  5. SQL Server認証’ を選択し、ログインIDとパスワードを入力します。ユーザ名は、次のフォーマット形式にする必要があります。 ‘username@servername.database.windows.net’. 次へをクリックします
  6. Change the default database to’ を選択し、master以外のデータベースを選択します。次へをクリックします。
  7. SQL Azureとクライアント間の通信を暗号化する為に、‘Use strong encryption for data’ を選択します。 完了をクリックします。
  8. 接続を確認する為に、Test Data Source をクリックします。

Ruby ODBCを使用してSQL Azureに接続する

次のコードは、SQL Azureデータベースへ接続するのにRuby ODBCを使用したサンプルです。DSN名‘azure’を指定し、‘names’テーブルの選択し、‘fname’ 列の値を取得しています。

require 'odbc'

sql='select * from [names]'
datasource='azure'
username='user@servername.database.windows.net'
password='password'

ODBC.connect(datasource,username,password) do |dbc|
results = dbc.run(sql)
results.fetch_hash do |row|
puts row['fname']
end
end

Active Recordは、SQL Azureデータベースへの接続にRuby ODBCを使用できます。次のサンプルは、Active RecordとODBC接続を使用したdatabase.ymlの例です。

development:
adapter: sqlserver
mode: ODBC
dsn: Driver={SQL Server};Server=servername.database.windows.net;Uid=user@servername.database.windows.net;Pwd=password;Database=databasename

注意:上の例のユーザ、パスワード、データベース名、サーバ名はあなたのSQL Azureデータベースに合った値に置き換える必要があります。

注意:SQL Azureのすべてのテーブルにクラスター化インデックスが必要です。もし、「クラスター化インデックスの無いテーブルはサポートしていません」とエラーが出たら、プライマリキーを追加してください。詳細は、Inside SQL Azureを参照してください。

注意:[schema_migrations]テーブルは、クラスター化インデックスが必要です。最初に、(rake db:migrate)の移行を試した時に、エラーが出ます。エラーを受け取った後、このテーブル用のクラスター化インデックスを作成する為に、次のコマンドをSQL Azureデータベースに実行してください。

CREATE CLUSTERED INDEX [idx_schema_migrations_version] ON [schema_migrations] ([version])

クラスター化インデックスを作成した後、移行に戻ると成功するでしょう。

TinyTDSの使用

gemインストールコマンドを使用してTinyTDSをインストールできますが、デフォルトでインストールできるバージョンは、今のところSQL Azureへの接続に対応していません。(SQL Serverには正しく動作します。)SQL Azureと通信するために、TinyTDSは、OpenSSLをビルドサポートしたFreeTDS版が必要です。現在、gemインストールできるバージョンのTODOリスト(https://github.com/rails-sqlserver/tiny_tds)にSQL Azureへの対応が記載されていますが、今のところは、SQL Azureへ接続できるFreeTDS版を自分自身でコンパイルする必要があります。

メモ:次の手順で私は準備しましたが、あなたの環境で正しく動作することを保証できません。より素晴らしい手順を知っている場合は、それを共有してこの記事の改善を手伝ってください。

Windows 7でFreeTDSをビルドする

環境:

  • http://rubyinstaller.org/からRuby 1.9.2-p180
  • http://rubyinstaller.org/からDevKit-tdm-32-4.5.1-20101214-1400-sfx.exe
  • OpenSSL 0.9.8h (GnuWin32 バイナリ ディストリビューション)
  • LibIconv 1.9.2 (GnuWin32 バイナリ ディストリビューション)

OpenSSLに対応したFreeTDSをビルドする

  1. Rubyをインストール後、DevKitをインストールし、https://github.com/oneclick/rubyinstaller/wiki/Development-Kitでテストします。

  2. FreeTDS.orgから最新のFreeTDSビルドをダウンロードします。. 私は、freetds-0.91rcを使用しました。

  3. Download and install a Win32 version of OpenSSLとLibIconvのWin32版をダウンロードし、インストールします。私は、ライブラリとヘッダーファイルを含むGnuWin32バイナリディストリビューションを使用しました。しかし、他のディストリビューションでも動作します。もしくは、ソースをダウンロードし自分自身のバージョンをビルドしても良いでしょう。

  4. OpenSSL と LibIconvをインストールかコンパイルし、FreeTDSソースを生成します。FreeTDSパッケージを生成する為に、7Zipのような.tgzフォーマットを認識するツールが必要です。

  5. FreeTDSを解凍したディレクトリで、‘Configure’ ファイルを探し、編集します。
    メモ: Notepadでは正しく行末を認識することができません。編集には、正しくファイルを読み込めるNotepad++のようなツールを使用してください。
    –lssl –lcryptoを検索します。次のような行があるはずです。

    NETWORK_LIBS="$NETWORK_LIBS –lssl –lcrypto"
    

    私の環境用に、次のように行を変更します。

    NETWORK_LIBS="$NETWORK_LIBS –lssl32 –leay32 –lwsock32 –lgdi32"
    

    プロジェクトのコンパイルを成功させるために編集します。

  6. DevKitフォルダーからmsys.batを実行します。sh.exeコマンドウィンドウが実行します。

  7. FreeTDSソースを生成した場所にディレクトリを変更します。私は、「cd d:」と入力しましたが、このシェルで表示されるパスは、UNIXスタイルで、/dと表示されます。./configure コマンドレターでディレクトリを指定する時、「/ドライブレター/フォルダー」フォーマットを使用してパスを指定することを推奨します。

  8. FreeTDSソースディレクトリから 次のコマンドを実行します。

    ./configure –prefix=<path to install FreeTDS to> —with-libiconv-prefix=<path to iconv> —with-openssl=<path to ssl>
    

    例では、libiconvをc:\libiconvにインストールし、OpenSSLはc:\OpenSSLにインストールされていると想定すると次のコマンドになります。

    ./configure –prefix=/c/freetds –with-libiconv-prefix=/c/libiconv –with-openssl=/c/openssl
    
  9. 設定手順後、次のコマンドを実行します。 make

  10. makeプロセスが完了したら、make installを実行します。設定で、**–prefix=**に指定したディレクトリにFreeTDSライブラリがコピーされます。

  11. システムの環境変数pathに、<freetds install directory>\binフォルダーを追加します。システムからFreeTDS.dllを参照できるようになります。
    メモ: システムpathにOpenSSL\binフォルダーも追加しなければなりません。

ローカルのFreeTDSライブラリを使用してtiny_tdsをビルドする

コマンドプロンプトで、次のコードを入力します。

gem install tiny_tds -platform=ruby -- --with-freetds-dir=<FreeTDS installation folder>

メモ;DBBIGINTの重複定義エラーを受け取った場合、 <FreeTDS install folder\include\sybdb.h を開き、次の行を探します。

typedef tds_sysdep_int64_type DBBIGINT;

この行をコメントアウトする為に、行の先頭に // を置き、gem インストールコマンドを再実行します。

TinyTDSを使用してSQL Azureに接続する

次のコードは、tiny_tds gemを使用してSQL Azureへ接続するサンプルです。

require 'tiny_tds'

client=TinyTds::Client.new(:username=>’user’, :password=> ‘password’, :dataserver=>’servername.database.windows.net', :port=>1433, :database=>’databasename’, :azure=>true)
results=client.execute("select * from [names]")
results.each do |row|
puts row
end

メモ:上のコードを実行した時に、ssleay32.dllをロードできないとのエラーを受け取った場合、OpenSSL/binフォルダーにssl32.dllファイルをコピーし、名前をssleay32.dllに変更します。

Tiny_tdsは、ActiveRecordを使用できます。次のサンプルは、tiny_tds gemを使用してSQL Azureへの接続にdblibを使用するためのdatabase.ymlの例です。

development:
adapter: sqlserver
mode: dblib
dataserver: 'servername.database.windows.net'
database: databasename
username: user
password: password
timeout: 5000
azure: true

注意:上の例のユーザ、パスワード、データベース名、サーバ名はあなたのSQL Azureデータベースに合った値に置き換える必要があります。

注意:SQL Azureのすべてのテーブルにクラスター化インデックスが必要です。もし、「クラスター化インデックスの無いテーブルはサポートしていません」とエラーが出たら、プライマリキーを追加してください。詳細は、Inside SQL Azureを参照してください。

注意:[schema_migrations]テーブルは、クラスター化インデックスが必要です。最初に、(rake db:migrate)の移行を試した時に、エラーが出ます。エラーを受け取った後、このテーブル用のクラスター化インデックスを作成する為に、次のコマンドをSQL Azureデータベースに実行してください。

CREATE CLUSTERED INDEX [idx_schema_migrations_version] ON [schema_migrations] ([version])

クラスター化インデックスを作成した後、移行に戻ると成功するでしょう。

Ruby ODataの使用

Ruby OData gem はODataサービスへの接続を可能にします。ODataはインターネット越しに、JSON、AtomPub、HTTPのような標準を使用してデータにアクセスするRESTfulメソッドです。  ODataの詳細情報は、http://www.odata.org/を参照してください。

OData用のSQL Azure設定

ODataのSQL Azureサポートは現時点では、Community Technical Preview (CTP)です。http://www.sqlazurelabs.com.  から接続できます。既存のデータベースでODataを有効にするために、次の手順を実行します。

  1. ブラウザを使用して、https://www.sqlazurelabs.com/にアクセスし、ODataリンクを選択します。Windows Azureサブスクリプションのログイン情報でログインします。
  2. SQL Azureサーバ名と管理者IDとパスワードを入力します。 Connect を選択します。
  3. データベースを選択し、'Enable OData'にチェックを入れます。
  4. 匿名アクセスに使用するアカウントを選択するか、Add Userをクリックしユーザを追加します。  終了したら、ODataサービス用のURLが表示さます。

Ruby ODataを使用してODataサービスに接続する

次のコードは、データベース名'testdb'を含んだODataサービスへ接続するコードです。.  テーブル名'People'から行を選択し'fname' と 'email' 列の内容を表示します。

require 'ruby_odata'

svc=OData::Service.new "https://odata.sqlazurelabs.com/OData.svc/v0.1/servername/testdb"
svc.People
people=svc.execute
people.each {|person| puts "#{person.fname} can be contacted at #{person.email}" }

参考文献

関連情報