SQLiteについてのメモ書き

SQLiteを使ってみて困ったこととかいろいろ調べたのでメモ。
あくまでメモなのでここに書かれていることを鵜呑みにしているとイタイメに会うかもしれません。
ここではPerlDBIをつかいます。

    • -

SQLiteってのはRDBMSで、一つのデータベースが一つのファイルになるのでお手軽に使えますってやつです。
バージョンは3系まであるよう。
コマンドラインから操作するためのツール(MySQLでいえばmysql)はsqliteってコマンドなんだけど3系ではsqlite3になっているよう。なぜなら2と3に互換性がないかららしい。たとえばsqliteで3系のDBを読んでみると、

takatoshi@sarge:~/misc$ sqlite sqlite3.db
Unable to open database "sqlite3.db": file is encrypted or is not a database 

となった。開けないらしい。では逆にsqlite3で2系のDBを読んでみると、

takatoshi@sarge:~/misc$ sqlite3 sqlite2.db
SQLite version 3.2.8
Enter ".help" for instructions
sqlite>  

となり、なにやら読めているらしい。試しにinsertとかしてみても普通にいく。

    • -

次にPerlDBI経由。
DBIはDBDってモジュールでそれぞれのRDBMSを抽象化していて、たとえばMySQLならDBD::MySQLという具合。SQLiteの場合、2系はDBD::SQLite2、3系はDBD::SQLiteです(SQLite3ではない)。では、さっきコンソールからやったようなことをCGI経由でやってみる。と、Internal Server ErrorになるのでApacheのエラーログになんて出るか。
まずはDBD::SQLite2で3系のDBを参照した場合。

DBI connect('dbname=/home/takatoshi/misc/sqlite3.db','',...) failed: file is encrypted or is not a database(1) at dbdimp.c line 57 at /home/takatoshi/misc/sqlite.cgi line 7 

接続できない。次にDBD::SQLiteで2系のDBを参照した場合。

DBD::SQLite::db do failed: file is encrypted or is not a database(26) at dbdimp.c line 269 at /home/takatoshi/misc/sqlite.cgi line 10. 

接続できるけどinsertできない。へぇ〜。

    • -

最後にauto incrementなカラムの作り方。

カラム型をINTEGER(小文字でもいい)にしてプライマリーキーにする。UNSIGNEDじゃダメ。INTもダメ。MySQLみたいにauto_incrementって指定は不要。

たとえばこんな感じのテーブル

create table comment (
  id integer primary key,
  name varchar(32),
  comment text
); 

を作って

sqlite> insert into comment(name, comment) values('here is a name', 'here is a comment');

とするとidが勝手に採番されます。
おわり。