フタなしカンヅメ

徒然なるままに @happytar0

はじめてのSQLite

はじめてSQLiteさわってみました。

さくらのワンコイン共有サーバ使っているのですがMySQLのDBは一つしか作れないのですね・・・。
不安定で遅い!というイメージだったので敬遠していたところがあったのですがMySQLより速い?らしい。よく考えたら軽い実装なのだから当たり前なのかな?

サーバの設定ではデフォで使えるようになっていた(PHP)ので、さっそくDBを作ってみよう!と思ったのだけど、よく考えたら安いプランでシェルが使えなかった。WebベースのSQLiteManagerというのを入れてみました。phpmyadminみたいなものみたいです。

無事にDBを作ってテーブルを流し込みました。型とか大丈夫なのかな?と心配でしたが、すんなりいって一安心。SQLiteは型の概念がほとんどないらしい。

ここまではよかったのですが、ここからちょっと引っかかりました。
PHPで昔作ったものでADODBというライブラリを使っていたのですが、DSNをSQLiteに書き換えても上手く動きません。

sqlite:///home/hogehoge/sqlite/hoge.db
SQL logic error or missing database

こんなエラーが出ました。パーミッション?SQL?と色々いじってみたのですが解決せず・・・。でもよく考えるとSQLiteManagerでは動いていた気がしました。ADODBのソースを見てみる事に・・・。

どうも独自に内部でDSNを処理しているらしく、parse_url関数の部分でエラーになってるっぽいです。ホスト名の指定がないせいで、正しいURLと解釈されないのが原因でした。絶対パスで指定するのが間違ってるのかな・・・?

sqlite://localhost/home/hogehoge/sqlite/hoge.db

こんな感じに直してみたらまだエラー。さらにソースを覗いてみると

if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename;

どうもホスト名が空じゃないとだめらしい・・・。これは無理かなと思い、別の方法を考えることに。

$con =& NewADOConnection('sqlite');
$con->Connect('/home/hogehoge/sqlite/hoge.db');

これで動きました!これが一番簡単みたい。でもどうしてもDSNで指定したいと思い、ソースを眺めてたらこんな記述がありました。

if (($at2 = strpos($origdsn,'@/')) !== FALSE) {
// special handling of oracle, which might not have host
$fakedsn = str_replace('@/','@adodb-fakehost/',$fakedsn);
}

どうやら@を使えばホスト名を指定しなくてもOKらしいです。結局これで解決しました。

# ちなみに@の後に/を二つ書かないと一つ目は消されるみたい
sqlite://@//home/hogehoge/sqlite/hoge.db

そんなこんなで小一時間かかりました。
そういえば、NOW()なんてのも動かないんですね・・・。