第3章 SQLiteを操作する-1

3-1. データの作成と抽出

DBI/DBDモジュールを使ったSQLiteの基本的な操作方法についてご説明します。
1. 接続と切断
SQLiteを利用する場合には、最初に「接続」を行い、処理が完了すると「切断」を行います。
接続と切断の方法は次のとおりです。
use DBI;

# 接続
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");

# 切断
$dbh->disconnect;
上記の例では、test.db というデータファイルへアクセスします。 接続に成功すると、$dbh を取得します。
接続を切断するには、disconnect を使用します。
以下のコードを実行すると、test.db という空ファイルが生成されます。
use strict;
use DBI;

# 接続
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");

# 切断
$dbh->disconnect;

# 完了
print "OK\n";
2. テーブルの作成
次はテーブル(表)の定義の仕方です。
今回は、次のようなシンプルな会員名簿テーブルを例に考えてみます。
ID name addr
1001 山田 東京都
1002 田中 東京都
1003 佐藤 埼玉県
table を作成するには、SQL文にて次のような形式で定義します。
create table [table名] ( カラム1, カラム2, ... カラムn )
テーブルには名前を付ける必要があります。
今回は、このテーブル名を「meibo」とします。 すると、SQLiteのテーブル定義は、次のようになります。
create table meibo (id, name, addr);
次に、会員名簿への各データ(カラムにおける値)を定義します。データは、1行ごとに次のような形式で定義します。
insert into [table名] ( カラム1, カラム2, ... カラムn ) values ( データ1, データ2, ... データn )
したがって、各データは次のように定義することができます。
insert into meibo (id, name, addr) values (1001, '山田', '東京都');
insert into meibo (id, name, addr) values (1002, '田中', '東京都');
insert into meibo (id, name, addr) values (1003, '佐藤', '埼玉県');
テーブルの作成定義は以上です。
DBI/DBDモジュールでは、これらの定義文は、do で実行します。
したがって、以下のコードを実行すると、test.db に会員名簿データが保存されます。
use strict;
use DBI;

# 接続
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");

# テーブル定義
$dbh->do("create table meibo (id,name,addr);");

# データ定義
$dbh->do("insert into meibo (id,name,addr) values (1001,'山田','東京都');");
$dbh->do("insert into meibo (id,name,addr) values (1002,'田中','東京都');");
$dbh->do("insert into meibo (id,name,addr) values (1003,'佐藤','埼玉県');");

# 切断
$dbh->disconnect;

# 完了
print "OK\n";
3. テーブルのデータ読み出し
前項で作成したテーブルの各データを読み出してみましょう。
テーブルから、データを読み出すには、select文を使って次のように定義します。
select * from [テーブル名]
DBI/DBDモジュールでは、select文の定義は prepare で、その命令実行を execute で行います。
my $sth = $dbh->prepare("select * from meibo"); # 命令文を定義
$sth->execute; # 命令を実行
次に、読み出したデータを受け取る処理が必要になります。
DBI/DBDモジュールでは、これを fetchrow_array で定義します。
出力されるデータは、1行ごとに受け取りますので、while文で展開します。
最後に、命令を終了するには finish です。
なお、finishの後に、undef関数で$sthをクリアしているのは、環境によっては実行後にエラーが出るための回避策です。
while (my @row = $sth->fetchrow_array) {
	print "@row\n";
}
$sth->finish;
undef $sth;
したがって、前項で保存した名簿データを取り出して、展開表示させるには、以下のコードを実行します。
use strict;
use DBI;

# 接続
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");

# テーブルの読み出し命令
my $sth = $dbh->prepare("select * from meibo");
$sth->execute;

# 各データを展開表示
while (my @row = $sth->fetchrow_array) {
	print "@row\n";
}
$sth->finish;
undef $sth;

# 切断
$dbh->disconnect;
>  1001 山田 東京都
>  1002 田中 東京都
>  1003 佐藤 埼玉県
データの中身は、特に指定をしない限りはこのように登録順に出力されます。
pagetop

3-2. データの追加と削除

1. データの追加
既存のデータベースに、データを追加したい場合を考えてみます。
たとえば、会員名簿 (meibo) の4行目に、次のデータを追加してみましょう。
ID name addr
1001 山田 東京都
1002 田中 東京都
1003 佐藤 埼玉県
1004 鈴木 千葉県 これを追加
以下のコードを実行すると、4件目のデータが追加されます。
use strict;
use DBI;

# 接続
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");

# データ追加
$dbh->do("insert into meibo (id,name,addr) values (1004,'鈴木','千葉県');");

# テーブルの読み出し命令
my $sth = $dbh->prepare("select * from meibo");
$sth->execute;

# 各データを展開表示
while (my @row = $sth->fetchrow_array) {
	print "@row\n";
}
$sth->finish;
undef $sth;

# 切断
$dbh->disconnect;
>  1001 山田 東京都
>  1002 田中 東京都
>  1003 佐藤 埼玉県
>  1004 鈴木 千葉県
2. データの削除
データを削除する場合は、次のような delete文が用意されています。
delete from [テーブル名] where [条件式]
以下のテーブル (meibo) で、2件目のデータを削除してみましょう。
ID name addr
1001 山田 東京都
1002 田中 東京都 これを削除
1003 佐藤 埼玉県
1004 鈴木 千葉県
delete文の「条件式」にて、ID番号が1002のデータですので、SQLiteに対して次のように定義することができます。
delete from meibo where id=1002;
したがって、次のコードを実行すれば、2件目データ (ID=1002) を削除することができます。
use strict;
use DBI;

# 接続
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");

# データ削除
$dbh->do("delete from meibo where id=1002;");

# テーブルの読み出し命令
my $sth = $dbh->prepare("select * from meibo");
$sth->execute;

# 各データを展開表示
while (my @row = $sth->fetchrow_array) {
	print "@row\n";
}
$sth->finish;
undef $sth;

# 切断
$dbh->disconnect;
>  1001 山田 東京都
>  1003 佐藤 埼玉県
>  1004 鈴木 千葉県
pagetop

3-3. データの更新

既存のテーブルデータの一部を変更する場合はどうしたらいいのでしょうか?
次のテーブル (meibo) で、ID=1003の佐藤さんが埼玉から神奈川へ引っ越しをしたので、名簿を更新することにします。
ID name addr
1001 山田 東京都
1003 佐藤 埼玉県 埼玉県を神奈川県へ変更
1004 鈴木 千葉県
データを変更する場合には、SQLiteでは update文が用意されています。
update [テーブル名] set カラム1=値1, カラム2=値2, ... カラムn=値n   where [条件式]
今回の更新対象は、1003=佐藤さんの住所地の変更ですから、SQLiteでは次のように定義することができます。
update meibo set addr='神奈川県' where id=1003;
したがって、以下のコードを実行することで、更新を行うことができます。
use strict;
use DBI;

# 接続
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");

# データ更新
$dbh->do("update meibo set addr='神奈川県' where id=1003;");

# テーブルの読み出し命令
my $sth = $dbh->prepare("select * from meibo");
$sth->execute;

# 各データを展開表示
while (my @row = $sth->fetchrow_array) {
	print "@row\n";
}
$sth->finish;
undef $sth;

# 切断
$dbh->disconnect;
>  1001 山田 東京都
>  1003 佐藤 神奈川県
>  1004 鈴木 千葉県
pagetop