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設定
- スタートメニューの検索欄に ‘ODBC’ と入力します。 **データソース (ODBC)**プログラムが表示されます。それを選択します。
- データソースプログラムで、 ユーザー DSNタブを選択し、追加をクリックします。
- SQL Server Native Client 10.0を選択し、 完了をクリックします。
- DSN名を入力し、SQL AzureデータベースDNSを入力し 次へをクリックします。
- ‘SQL Server認証’ を選択し、ログインIDとパスワードを入力します。ユーザ名は、次のフォーマット形式にする必要があります。 ‘username@servername.database.windows.net’. 次へをクリックします
- ‘Change the default database to’ を選択し、master以外のデータベースを選択します。次へをクリックします。
- SQL Azureとクライアント間の通信を暗号化する為に、‘Use strong encryption for data’ を選択します。 完了をクリックします。
- 接続を確認する為に、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をビルドする
Rubyをインストール後、DevKitをインストールし、https://github.com/oneclick/rubyinstaller/wiki/Development-Kitでテストします。
FreeTDS.orgから最新のFreeTDSビルドをダウンロードします。. 私は、freetds-0.91rcを使用しました。
Download and install a Win32 version of OpenSSLとLibIconvのWin32版をダウンロードし、インストールします。私は、ライブラリとヘッダーファイルを含むGnuWin32バイナリディストリビューションを使用しました。しかし、他のディストリビューションでも動作します。もしくは、ソースをダウンロードし自分自身のバージョンをビルドしても良いでしょう。
OpenSSL と LibIconvをインストールかコンパイルし、FreeTDSソースを生成します。FreeTDSパッケージを生成する為に、7Zipのような.tgzフォーマットを認識するツールが必要です。
FreeTDSを解凍したディレクトリで、‘Configure’ ファイルを探し、編集します。
メモ: Notepadでは正しく行末を認識することができません。編集には、正しくファイルを読み込めるNotepad++のようなツールを使用してください。
–lssl –lcryptoを検索します。次のような行があるはずです。NETWORK_LIBS="$NETWORK_LIBS –lssl –lcrypto"
私の環境用に、次のように行を変更します。
NETWORK_LIBS="$NETWORK_LIBS –lssl32 –leay32 –lwsock32 –lgdi32"
プロジェクトのコンパイルを成功させるために編集します。
DevKitフォルダーからmsys.batを実行します。sh.exeコマンドウィンドウが実行します。
FreeTDSソースを生成した場所にディレクトリを変更します。私は、「cd d:」と入力しましたが、このシェルで表示されるパスは、UNIXスタイルで、/dと表示されます。./configure コマンドレターでディレクトリを指定する時、「/ドライブレター/フォルダー」フォーマットを使用してパスを指定することを推奨します。
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
設定手順後、次のコマンドを実行します。 make
makeプロセスが完了したら、make installを実行します。設定で、**–prefix=**に指定したディレクトリにFreeTDSライブラリがコピーされます。
システムの環境変数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を有効にするために、次の手順を実行します。
- ブラウザを使用して、https://www.sqlazurelabs.com/にアクセスし、ODataリンクを選択します。Windows Azureサブスクリプションのログイン情報でログインします。
- SQL Azureサーバ名と管理者IDとパスワードを入力します。 Connect を選択します。
- データベースを選択し、'Enable OData'にチェックを入れます。
- 匿名アクセスに使用するアカウントを選択するか、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}" }
参考文献
- https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/wiki/Using-Azure
- http://www.java2s.com/Code/Ruby/Database/ODBCconnection.htm
- http://metaskills.net/2010/10/18/tinytds-a-modern-simple-and-fast-freetds-library-for-ruby-using-db-library/
- http://blogs.visoftinc.com/2010/06/12/Introducing-a-Ruby-OData-Client-Library/