はじめて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()なんてのも動かないんですね・・・。