DBI風インタフェースの簡易DBをperlで実装したい
最近、perlでCGIを作ってファイル入出力することが多くて、データが複雑になってくるとDB使った方が楽なので使いたいんだけど、サーバーによっては使えないところもあるので悩ましい。使えないほうにあわせてファイルI/Oで作りこんでおいても、やっぱり後でデータが増えてきたときに、DB使えるサーバーに移っても同じプログラムを使えたらいいな。
ということで、DBIと同じインタフェースの簡易DBをperl実装で作っちゃおうかと思ってます。
仕様は、次のような感じ。
- 使えるSQL文(下記のシンタックス通りの文のみ)
- CREATE TABLE テーブル (カラム 型, カラム 型, ...)
- SELECT * FROM テーブル
- SELECT * FROM テーブル WHERE カラム=値
- SELECT * FROM テーブル WHERE カラム BETWEEN 値 AND 値
- INSERT INTO テーブル VALUES (値, 値, ...)
- UPDATE テーブル SET カラム=値,カラム=値,... WHERE カラム=値
- DELETE FROM テーブル
- DELETE FROM テーブル WHERE カラム=値
- 使える関数
- DBI->connect
- $dbh->prepare
- $sth->execute
- $sth->rows
- $sth->fetchrow_array
- $sth->finish
- 制限事項
最低限、下記のテストコードが動くものにします。
use DBIverysimple; my $dbh = DBIverysimple->connect("data", "inutch", "xxxxxxxx"); if(!defined($dbh)){ print "connect error.\n"; exit; } my $sql; my $sth; $sql = "CREATE TABLE test(time timestamp, title varchar, text varchar)"; print $sql . "\n"; $sth = $dbh->prepare($sql); if(defined($sth)){ $sth->execute(); } $sql = "INSERT INTO test VALUES(?, ?, ?)"; print $sql . "\n"; $sth = $dbh->prepare($sql); if(defined($sth)){ $sth->execute("2008/01/01 08:00:00", "1111", "テスト1"); } if(defined($sth)){ $sth->execute("2008/01/03 10:05:01", "3333", "テスト3"); } if(defined($sth)){ $sth->execute("2008/01/02 22:30:25", "2222", "テスト2"); } $sql = "UPDATE test SET title=?,text=? WHERE time=?"; print $sql . "\n"; $sth = $dbh->prepare($sql); if(defined($sth)){ $sth->execute("2222B", "テスト2B", "2008/01/02 22:30:25"); } $sql = "SELECT * FROM test WHERE time=?"; print $sql . "\n"; $sth = $dbh->prepare($sql); if(defined($sth)){ $sth->execute("2008/01/03 10:05:01"); my $n = $sth->rows(); for(my $i=0; $i<$n; $i++){ my @a = $sth->fetchrow_array(); print @a . "\n"; } } $sql = "SELECT * FROM test WHERE time BETWEEN ? AND ?"; print $sql . "\n"; $sth = $dbh->prepare($sql); if(defined($sth)){ $sth->execute("2008/01/01 00:00:00", "2008/01/02 23:59:59"); my $n = $sth->rows(); for(my $i=0; $i<$n; $i++){ my @a = $sth->fetchrow_array(); print @a . "\n"; } } $sql = "DELETE FROM test WHERE time=?"; print $sql . "\n"; $sth = $dbh->prepare($sql); if(defined($sth)){ $sth->execute("2008/01/02 22:30:25"); } $sql = "SELECT * FROM test"; print $sql . "\n"; $sth = $dbh->prepare($sql); if(defined($sth)){ $sth->execute(); my $n = $sth->rows(); for(my $i=0; $i<$n; $i++){ my @a = $sth->fetchrow_array(); print @a . "\n"; } }