データベースの基礎 / Mojolicious入門
次にデータを保存するために、データベースの利用方法を学びましょう。Webアプリケーションでは、データはデータベースに保存するようにしましょう。過去の時代においてはファイルに保存されることも多かったですが、ファイルのロック機構や、アクセス量などを考えると、データベースを利用するのが最善です。
データベースにはSQLite, MySQL, PostgreSQLなどありますが、今回はもっとも簡単なSQLiteを使います。SQLiteは簡単ですが、機能に制限がありますので、Webサイトを実際に作るときの最善の選択はMySQLかPostgreSQLです。MySQLについては、応用編で扱いたいと思います。
データベースについて、詳しく解説するよりも、今回は使い方を中心に解説します。最初にsqlite3というSQLiteのデータベースを利用するアプリケーションを使って、データベース操作の基礎を覚えましょう。
sqlite3のインストール
まずSQLiteを操作するためのツールであるsqlite3をインストールします。
Windowsへのsqlite3のインストール
Windowsを利用している場合は次の手順でsqlite3をダウンロードします。以下のサイトにからsqlite3をダウンロードしてください。
zipファイルをダウンロードするので、展開してください。「sqlite3.exe」というファイルがあるのを確認してください。これがSQLiteのデータベースを操作するためのアプリケーションです。これをアプリケーションのパスが通っている場所に配置する必要があります。
今回はPerlをインストールしたディレクトリと同じディレクトリに配置しましょう。「C:\Perl\site\bin」というディレクトリの中に「sqlite3.exe」をコピーして配置してください。
次にコマンドプロンプトを立ち上げて次のコマンドを実行してください。
sqlite3 test.db
以下のようにsqlite3が起動すれば、インストールは完了です。
SQLite version 3.8.4.3 2014-04-03 16:53:12 Enter ".help" for usage hints. sqlite>
終了するには「.q」と入力してEnterを押します。
.q
Mac OS Xへのsqlite3のインストール
Mac OS Xにはsqlite3が最初からインストールされているので、特別な作業は必要ありません。ターミナルからsqlite3を起動してみましょう。
sqlite3 test.db
以下のようにsqlite3が起動するか確認しましょう。
SQLite version 3.8.4.3 2014-04-03 16:53:12 Enter ".help" for usage hints. sqlite>
終了するには「.q」と入力してEnterを押します。
.q
Linuxへのsqlite3のインストール
CentOS, Redhat Linux, Fedoraの場合は、yumコマンドでsqlite3をインストールします。
yum -y install sqlite
Ubuntuの場合はapt-getコマンドでsqlite3をsqlite3をインストールします。
sudo apt-get install -y sqlite3
次にシェルから次のコマンドを実行してください。
sqlite3 test.db
以下のようにsqlite3が起動すれば、インストールは完了です。
SQLite version 3.8.4.3 2014-04-03 16:53:12 Enter ".help" for usage hints. sqlite>
終了するには「.q」と入力してEnterを押します。
.q
テーブルの作成
SQLiteではデータは、ファイルに保存されます。test.dbという名前のファイルでデータベースを作成しましょう。
sqlite3 test.db
sqlite3が起動したら最初にテーブルを作成します。テーブルを作成するには「create table」構文を使用します。データベースへ命令を行う言語のことをSQLといいます。「create table」もSQLのひとつです。
bookというテーブル名で、id, title, authorという列を持つテーブルを作成する「create table」を実行してみましょう。
create table book ( id primary key, title not null default '', author not null default '' );
列の定義は「列名 (型) (オプション)」という形式でなされます。
列名 (型) (オプション)
列名は必須です。SQLiteではデータ型を指定する必要はありません。データ型を指定しなかった場合は文字列として扱われます。
各テーブルには主キーをあらわすidを指定しておきましょう。これは、行を一意に識別するためのものです。主キーにはprimary key制約をつけます。primary key制約は、各行が一意であることを保障するためのもので、重複する主キーを登録を禁止するためのものです。
他の列にはnot null制約をつけるようにします。not null制約とは、行にnullという値を設定できないようにする制約です。not null制約を行う場合はdefaultを設定する必要がありますのであわせて設定します。
nullはできる限り使わないほうがよいというのが、よい習慣ですので、すべての列にnot null制約をつけておきましょう。not nullを前提にしてデータベースを設計するのがよいです。
テーブル一覧の表示
テーブルを作成したらどのようなテーブルが存在するかを見てみましょう。テーブル一覧を表示するには「.tables」コマンドを使用します。
.tables
テーブルの一覧が表示されます。
book
テーブルの定義を確認
create table文で作成したテーブルの定義を確認してみましょう。「.schema」コマンドを使用します。
.schema book
テーブルの定義が表示されます。
CREATE TABLE book ( id primary key, title not null default '', author not null default '' );
行の挿入 - insert文
次に行を挿入してみましょう。データベースに行を挿入するにはinsert文を使用します。
# 使用方法 insert into テーブル名 (列名1, 列名2, ...) values (値1, 値2, 値3);
実際にデータを挿入してみます。「id」が「00000001」、「title」が「Perl」、「author」が「kimoto」というデータをデータベースに挿入しましょう。文字列はシングルクォートで囲む必要があります。
insert into book (id, title, author) values ('00000001', 'Perl', 'kimoto');
どのような行が挿入されたかselect文を使って見てみましょう。select文については詳しく後ほど解説します。
select * from book;
次のように表示されます。
00000001|Perl|kimoto
列名が表示されていないので少し見づらいですね。.headerコマンドを実行しておくと、列名を表示することができます。
.header on
もう一度select文を実行してみてください。次のように列名を含めて、行が表示されます。
id|title|author 00000001|Perl|kimoto
行の更新 - update文
次に行を更新してみましょう。行を更新するにはupdate文を使用します。
update テーブル名 set 列名1 = 値1, 列名2 = 値2, ... where 条件
update文では、where句を使って条件を指定して、条件にマッチした行を更新するという動作を行います。where句を指定しなかった場合は、すべての行が更新されてしまうので、よく注意してください。
ではupdate文を使って「title」列の「Perl」という文字列を「Ruby」に変更してみましょう。条件に「id」の値を指定して、更新します。
update book set title = 'Ruby' where id = '00000001';
select文で、値が変更されていることを確認してみましょう。
select * from book;
次のように表示されます。
00000001|Ruby|kimoto
行の削除 - delete文
次に行を削除してみましょう。行を削除するにはdelete文を使用します。
delete from テーブル名 where 条件
delete文では、where句を使って条件を指定して、条件にマッチした行を削除するという動作を行います。where句を指定しなかった場合は、すべての行が削除されてしまうので、よく注意してください。
ではdelete文を使って、行を削除してみましょう。条件に「id」の値を指定して、削除します。
delete from book where id = '00000001';
select文で、値が変更されていることを確認してみましょう。
select * from book;
行が削除されたので、何も表示されません。
行の選択 - select文
行を取得するためにselect文を書いてきましたが、もう少し詳しく解説しておきます。まず、select文を試すために、以下のSQLで、行を挿入してください。
insert into book (id, title, author) values ('00000001', 'Perl Tutorial', 'kimoto'); insert into book (id, title, author) values ('00000002', 'Perl advantage', 'ken'); insert into book (id, title, author) values ('00000003', 'Ruby Tutorial', 'yosuke');
列の選択
select文では「*」を指定した場合は、すべての列を取得することができます。また列名を指定して、対象の列だけを取得することもできます。
# すべての列 select * from book; # id select id from book; # idとtitle # select id, title book;
条件 - where句
select文はwhere句で条件を指定して使うことが多いです。
select 列名 from テーブル名 where 条件
条件演算子には以下のものがあります。
演算子 | 意味 |
= | 等しい |
<> | 等しくない |
~より大きい | > |
~より大きい、または等しい | >= |
~より小さい | < |
~より小さい、または等しい | <= |
~を含む | like |
ヌル | is null |
ヌルではない | is not null |
演算子は次のように利用できます。
# 「id」が「00000002」に等しい select * from book where id = '00000002';
like演算子の使い方が少し異なるので解説します。like演算子を使う場合は、文字列の中にワイルドカードとして「%」を使うことができます。次のように記述すれば「title」に「Perl」を含んでいる行だけを取得することができます。
# 「title」に「Perl」を含む select * from book where title like '%Perl%';
これでデータベースにデータを保存して、取得する最低限の知識はマスターできました。