$dbh->do(q{
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
is_done INTEGER DEFAULT 0
)
});
id は自動採番
is_done は 0(未完了)または 1(完了)
CRUD操作
INSERT(追加)
1
2
$dbh->do("INSERT INTO tasks (title) VALUES (?)",undef,$title);my$id=$dbh->last_insert_id(undef,undef,"tasks","id");
? はプレースホルダで、SQLインジェクション対策になります。
SELECT(取得)
1
2
3
4
5
6
7
8
9
10
11
# 全件取得my$sth=$dbh->prepare("SELECT id, title, is_done FROM tasks");$sth->execute();while(my$row=$sth->fetchrow_hashref){print"$row->{id}: $row->{title}\n";}# 1件取得my$sth=$dbh->prepare("SELECT id, title, is_done FROM tasks WHERE id = ?");$sth->execute($id);my$row=$sth->fetchrow_hashref;
UPDATE(更新)
1
$dbh->do("UPDATE tasks SET is_done = ? WHERE id = ?",undef,1,$id);
DELETE(削除)
1
$dbh->do("DELETE FROM tasks WHERE id = ?",undef,$id);
packageTaskRepository::SQLite{useMoo;useDBI;with'TaskRepository::Role';hasdbfile=>(is=>'ro',default=>sub{'tasks.db'},);hasdbh=>(is=>'lazy',builder=>'_build_dbh',);sub_build_dbh{my$self=shift;my$dbh=DBI->connect("dbi:SQLite:dbname=".$self->dbfile,"","",{PrintError=>0,RaiseError=>1,AutoCommit=>1})ordie$DBI::errstr;# テーブルが存在しなければ作成$dbh->do(q{
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
is_done INTEGER DEFAULT 0
)
});return$dbh;}subsave{...}subfind{...}suball{...}subremove{...}}
subsave{my($self,$task)=@_;if($task->id&&$task->id>0){# 既存タスクの更新$self->dbh->do("UPDATE tasks SET title = ?, is_done = ? WHERE id = ?",undef,$task->title,$task->is_done?1:0,$task->id);}else{# 新規タスクの追加$self->dbh->do("INSERT INTO tasks (title, is_done) VALUES (?, ?)",undef,$task->title,$task->is_done?1:0);$task->id($self->dbh->last_insert_id(undef,undef,"tasks","id"));}return$task;}
findメソッドの実装ヒント
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
subfind{my($self,$id)=@_;my$sth=$self->dbh->prepare("SELECT id, title, is_done FROM tasks WHERE id = ?");$sth->execute($id);my$row=$sth->fetchrow_hashref;returnunless$row;returnTask->new(id=>$row->{id},title=>$row->{title},is_done=>$row->{is_done}?1:0,);}
allメソッドの実装ヒント
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
suball{my$self=shift;my$sth=$self->dbh->prepare("SELECT id, title, is_done FROM tasks ORDER BY id");$sth->execute();my@tasks;while(my$row=$sth->fetchrow_hashref){push@tasks,Task->new(id=>$row->{id},title=>$row->{title},is_done=>$row->{is_done}?1:0,);}return@tasks;}
removeメソッドの実装ヒント
1
2
3
4
5
6
7
8
9
10
subremove{my($self,$id)=@_;my$rows=$self->dbh->do("DELETE FROM tasks WHERE id = ?",undef,$id);return$rows>0?1:0;}
my$use_sqlite=0;GetOptions('verbose|v'=>\$verbose,'file|f=s'=>\$filepath,'sqlite|s'=>\$use_sqlite,'help|h'=>\$help,)ordie"Error in command line arguments\n";my$repository;if($use_sqlite){$repository=TaskRepository::SQLite->new;}else{$repository=TaskRepository::File->new(filepath=>$filepath);}