CakePHPからSQLServer(MSSQL)サーバにアクセスをするにはFreeTDSを使ったODBC経由でのアクセスになるようだ

CakePHP2はデフォルトで各種データベースにアクセスするためのドライバ・モジュールが用意されていて、app/Config/databases.phpファイルにdatasourceとして指定するだけでドライバが選択されて、$this->Table->find(‘all’);のようにアクセスができる。そしてそれはMSSQL、すなわちMicrosoft SQL Serverでも同様なのだ……と思っていた。が、実際にCakePHPからMSSQLにアクセスをする需要が発生したのでdatabases.phpファイルを書いてみたものの、まったくアクセスできず。tcpdumpでモニタしていると、パケットすら出ていない。これはドライバが選択されていないかエラーになっている可能性があるのではなだろうか……。

日本語英語含めてさまざまに検索して調べてみたが、databases.phpにデータソースを書いてうまくいったという人もいれば、PDO経由で普通にCakePHPのModelの枠から外れてコントローラからアクセスするなどで対応しているなど、まちまちであった。


その中から可能性を見出したのがFreeTDSunixODBCという、フリーのUNIX向けアプリケーションをインストールする必要がある。私の環境はAmazon EC2上のCentOSだったので、yumインストールを実施。パッケージインストーラが使えない環境の人はソースパッケージから構築する必要がある。それについてはこちらの方のブログに書かれているので参考にされるよいだろう。ちなみに私はDBのプロでもなければこのあたりの仕様にもまったくうといので、ODBCやらTDSやらが何であるかなどはあまり理解していない(本当はよくないけど、おおざっぱにしか理解していない。説明しろといわれてもたぶん困難)。いまの時期・時代になってもいまだODBC依存しなければならないというのは何か理由があってのことなのか否かは不明である。TCP/IPで直接APIの門戸を開いてもよさそうなのだが、昨今の時代的にみれば……。

■unixODBC + FreeTDS + perlで、MS SQL Serverに接続する – fujishinko 雑記帳
http://fujishinko.exblog.jp/8157571/

yumからインストールする場合は簡単である。

[shell]
# yum install unixODBC-devel
# yum install freetds-devel
[/shell]

FreeTDSはSybaseやSQL Serverと通信をするためのプロトコルスイート、つまり単なるインタフェース群でしかないため、RDMSとしてのアクセスを要する場合にはODBCドライバを経由して行わなければならない。従ってFreeTDSをインストールだけではデータベースへの実質的なアクセスは完成しない点に注意が必要だろう。概念的な話は、こちらのサイトが詳しいと思う。

■FreeTDS を使った UNIX ODBC ドライバの製作 – ばぁばのODBC実験室
http://www.amy.hi-ho.ne.jp/jbaba/unix/tdsodbc.htm

さて、FreeTDSにもunixODBCにも設定ファイルがそれぞれ存在する。まずはFreeTDSから。/etc/freetds.confファイルを編集した。なお設定ファイルが保存されているパスはシステムのパッケージインストールの種類やインストール時のパス指定などで異なる場合があるので事前に確認されたい。/usr/local/etcあたりなどになっている場合もあるだろう(Liux系はたいがい/etc配下、BSD系はたいがい/usr/local配下だったりするかな)。
以下は私の設定ファイル例である。

[text]
[myhost]
host = mssql.example.com
port = 1433
tds version = 7.0
charset = UTF-8
client charset = UTF-8
language = japanese
[/text]

設定ファイルの末尾に上記を追加した。1行目はtsqlというコマンドなどから対象DBを指定するための識別子で任意である。サーバ別に設定する場合などはホスト名などの識別子を書いておくのがいいだろう。
2行目は実際のMSSQLサーバが稼働しているサーバのホスト名。3行目はポート番号。SQL Serverは1433を使う。
その他見ればわかるが、tds versionは7.0、charsetはUTF-8、languageはjapaneseなどと指定している。languageは特に指定しなくても日本語文字列の通信に影響はないと思われる。

次にunixODBC。こちらは2種類のファイルの設定が必要であった。
まずは/etc/odbc.iniから。

[text]
[ODBC Data Sources]
SQLServer = MSSQL

[SQLServer]
Driver = /usr/lib64/libtdsodbc.so
Description = MSSQL
Trace = No
Servername = myhost
Database = mydatabase

[Default]
Driver = /usr/lib64/libtdsodbc.so
[/text]

ODBC Data Sourcesとして2行目の「SQLServer = MSSQL」としている。左辺は4行目に出てくる指定子に一致し、これはMSSQLとの通信であることを設定している。
4行目からはODBCライブラリのフルパス指定とサーバ名、アクセスするデータベース名などの指定である。
8行目のServernameの右辺は、freetds.confの[myhost]に一致した名前であること。freetds.confのほうが[hogehoge]であれば、8行目はServername=hogehogeとなる。

もう一つは/etc/odbcinst.iniファイルの設定で、こちらはFreeTDS経由でアクセスする場合のドライバとしてODBCライブラリをフルパスで指定する。Driver64はなくてもいいかもしれない。

[text]
[FreeTDS]
Driver = /usr/lib64/libtdsodbc.so
Driver64 = /usr/lib64/libtdsodbc.so
[/text]

これらの設定が終わったら、以下のようにtsqlコマンドでアクセスできるかどうかチェックするとよいだろう。

[shell]
# tsql -S myhost -U myuser -P mypass
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> select * from mytable;
2> go
no id name
1 100211 ほげ太ほげ夫
2 100212 ふげ川ふげ子
(2 rows affected)
1> quit
[/shell]

さて、いよいよCakePHPでの設定である。ここからは箇条書き的に手順を示す程度となる。特に見せる画像などもないので文字ベースでだらだら書くのである。

(1) githubから最新の追加datasourcesを入手してCakePHPのあるマシンに用意
https://github.com/cakephp/datasources/tree/2.0
(2) cd /var/www/html/cakephp/app/Plugins (CakePHPのPluginsディレクトリに移動)
(3) mkdir Datasources
(4) (1)のファイルを展開 (unzip datasources.zip)
(5) chown -R apache:apache . (念のため。またuid/gidは適宜自分の環境に適したものを使用すること)
(6) cd /var/www/html/cakephp/app/Config
(7) vi databases.php (以下を書く)
[php]
public $mytable = array(
‘datasource’ => ‘Datasources.Database/Mssql’,
‘persistent’ => false,
‘host’ => ‘mssql.example.com’,
‘port’ => ‘1433’,
‘login’ => ‘myuser’,
‘password’ => ‘mypass’,
‘database’ => ‘mydatabase’,
‘encoding’ => ‘utf8’,
‘prefix’ => ”
);
[/php]
(8) cd ../Model
(9) vi Mytable.php (以下を書く)
[php]
App::uses(‘AppModel’, ‘Model’);
app::uses(‘Mssql’, ‘Datasources.Model/Datasource/Database’);

class Mytable extends AppModel {
public $name = "Mytable";
public $useDbConfig = ‘mytable’; // $mytableの設定を使用
}
[/php]
(10) cd ../Controller
(11) vi MytablesController.php
[php]
CakePlugin::load(‘Datasources’);

App::uses(‘AppController’, ‘Controller’);
App::uses(‘Mytable’, ‘Model’);

class MytablesController extends AppController {

public function index()
{
$t = new Mytable();
$d = $t->find(‘all’);
echo "<pre>";
print_r($d);
echo "</pre>";
}
}
[/php]

最安!チーズケーキ ニューヨークチーズケーキ NYチーズケーキ 直径20センチ 910g!業務用ケーキ 業務用スイーツ ベイクドチースケーキCA貯蔵 長野県産 りんご サンふじ Cランク 10kg  (家庭用) (24玉~40玉) 訳あり(キズ・色ムラ・割れなど)  [糖度13度以上] 光センサー選果旬のおまかせ 九州 野菜セット 12品以上+ときどきオマケOCS 亀山社中 無敵の炭火焼肉福袋 カルビ・カタロース・ハラミ・鶏ハラミ約1.4kg(約8~10人)モエ・エ・シャンドン モエ ロゼ アンペリアル 750ml北海道ワイン おたるナイヤガラ スパークリング 720ml

“CakePHPからSQLServer(MSSQL)サーバにアクセスをするにはFreeTDSを使ったODBC経由でのアクセスになるようだ” への11件の返信

  1. はじめまして。yoshidaと申します。
    CakePHPからSQLServerに接続する方法を調べていた所、こちらにたどり着きました。

    CakePHPでの設定についてですが、これは記述されている内容以外に設定すべき点はありますでしょうか?
    参考にさせていただき進めていたのですが、結果接続できていない現状です。

    >(2) cd /var/www/html/cakephp/app/Plugins (CakePHPのPluginsディレクトリに移動)
    appディレクトリのPluginでよろしいでしょうか。
    (cakephp/pluginsか、cakephp/app/Plugin?)

    >(3) mkdir Datasources
    >(4) (1)のファイルを展開 (unzip datasources.zip)
    >(5) chown -R apache:apache . (念のため。またuid/gidは適宜自分の環境に適したものを使用すること)
    Plugin直下にDatasourcesフォルダを作成し、展開したファイル内を移しているのでしょうか。
    (Plugin/Datasources/配下にModel、Testディレクトリが配置されていれば良い?)

    >(6) cd /var/www/html/cakephp/app/Config
    >(7) vi databases.php (以下を書く)
    >public $mytable = array(
    > ‘datasource’ => ‘Datasources.Database/Mssql’,
    > ‘persistent’ => false,
    > ‘host’ => ‘mssql.example.com’,
    > ‘port’ => ‘1433’,
    > ‘login’ => ‘myuser’,
    > ‘password’ => ‘mypass’,
    > ‘database’ => ‘mydatabase’,
    > ‘encoding’ => ‘utf8’,
    > ‘prefix’ => ”
    >);
    Datasourceの値はDatasources.Database/Mssqlで良いのでしょうか。
    Database直下には、Mssql.phpはなく、Sqlsrv.phpが存在しています。

    突然の質問で申し訳ございませんが、ご教授していただければと思います。

コメントを残す

メールアドレスが公開されることはありません。