第3章 SQLiteを操作する-1
3-1. データの作成と抽出
DBI/DBDモジュールを使ったSQLiteの基本的な操作方法についてご説明します。
1. 接続と切断
SQLiteを利用する場合には、最初に「接続」を行い、処理が完了すると「切断」を行います。
接続と切断の方法は次のとおりです。
接続を切断するには、disconnect を使用します。
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. テーブルの作成
次はテーブル(表)の定義の仕方です。
今回は、次のようなシンプルな会員名簿テーブルを例に考えてみます。
table を作成するには、SQL文にて次のような形式で定義します。
今回は、このテーブル名を「meibo」とします。 すると、SQLiteのテーブル定義は、次のようになります。
次はテーブル(表)の定義の仕方です。
今回は、次のようなシンプルな会員名簿テーブルを例に考えてみます。
ID | name | addr |
---|---|---|
1001 | 山田 | 東京都 |
1002 | 田中 | 東京都 |
1003 | 佐藤 | 埼玉県 |
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 に会員名簿データが保存されます。
したがって、以下のコードを実行すると、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文を使って次のように定義します。
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をクリアしているのは、環境によっては実行後にエラーが出るための回避策です。
出力されるデータは、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 佐藤 埼玉県データの中身は、特に指定をしない限りはこのように登録順に出力されます。
3-2. データの追加と削除
1. データの追加
既存のデータベースに、データを追加したい場合を考えてみます。
たとえば、会員名簿 (meibo) の4行目に、次のデータを追加してみましょう。
以下のコードを実行すると、4件目のデータが追加されます。
既存のデータベースに、データを追加したい場合を考えてみます。
たとえば、会員名簿 (meibo) の4行目に、次のデータを追加してみましょう。
ID | name | addr | |
---|---|---|---|
1001 | 山田 | 東京都 | |
1002 | 田中 | 東京都 | |
1003 | 佐藤 | 埼玉県 | |
1004 | 鈴木 | 千葉県 | これを追加 |
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文の「条件式」にて、ID番号が1002のデータですので、SQLiteに対して次のように定義することができます。
データを削除する場合は、次のような delete文が用意されています。
delete from [テーブル名] where [条件式]
以下のテーブル (meibo) で、2件目のデータを削除してみましょう。
ID | name | addr | |
---|---|---|---|
1001 | 山田 | 東京都 | |
1002 | 田中 | 東京都 | これを削除 |
1003 | 佐藤 | 埼玉県 | |
1004 | 鈴木 | 千葉県 |
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 鈴木 千葉県
3-3. データの更新
既存のテーブルデータの一部を変更する場合はどうしたらいいのでしょうか?
次のテーブル (meibo) で、ID=1003の佐藤さんが埼玉から神奈川へ引っ越しをしたので、名簿を更新することにします。
データを変更する場合には、SQLiteでは update文が用意されています。
次のテーブル (meibo) で、ID=1003の佐藤さんが埼玉から神奈川へ引っ越しをしたので、名簿を更新することにします。
ID | name | addr | |
---|---|---|---|
1001 | 山田 | 東京都 | |
1003 | 佐藤 | 埼玉県 | 埼玉県を神奈川県へ変更 |
1004 | 鈴木 | 千葉県 |
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 鈴木 千葉県