データベースに関する基本知識

 ここで,データベースに明るくないという人のために,ものすごく駆け足ですがデータベースの構造というものを説明しておくことにしましょう。

 まず「データベース」です。データベースという単語には二つの意味があります。次のような使い方をします。

・SQLiteやMySQL,Accessはデータベースです
・testという名前でデータベースを作ります

 どちらも間違ってはいませんが用語が混乱します。最初の文は正しくは「データベース・サービス」「データベース・サーバー」「データベース・アプリケーション」を略して「データベース」と呼んでいます。2番目の文はもっと限定的で,Bはデータベース・サービスの管轄化にtestという名前のデータ集合体を作成するという意味です。データベース・アプリケーションでは,データを格納する一番大きな単位が「データベース」と呼ばれます(図4)。文中にデータベースという単語が出てきたら,どっちの意味なのかはケースによって判読してください。

図4:データベースの構造模式図

 このデータベースの中に「テーブル」という単位があります。テーブルはExcelでいうシートに該当します。テーブルの各行(Excelでいう横列)は1データで,縦列は「カラム」と呼ばれます。Excelの話になると縦横を逆に使ってしまうこともあるので,ちょっと縦だ横だというのは相応しくないかもしれませんが,およその理解としてはそんな感じです。カラムの集合体がテーブルで,テーブルの集合体がデータベースです。

 データベースについては別の連載になりますが拙稿(エンジニアでない人のための「Web+DBサイト」入門:第4回 会議で恥をかかないデータベースの構造の基本知識)も参照していただければと思います。なおデータベースの操作にはSQL文と呼ばれるデータベース問い合わせ言語が使われます。SQL文の参考書などを用意されることをお勧めします。

 データの出し入れはテーブルに対して行われます。Excelでどのシートに書き込むかという考え方に似ています。サンプルのtesttableというテーブルは「colA」「colB」「colC」という三つのカラムをもっています。このカラムに対して,最初に"A","B","C"というデータをいれ,次に"One","Two","Three"というデータを,最後に"田中","鈴木","高橋"というデータを入れています。"田中","鈴木","高橋"でいえば,colAには田中が,colBには鈴木,colCには高橋が入ります。データを入れる処理は次のようになります。テーブルを作成する命令と一緒に見てください。

db.execute('CREATE TABLE IF NOT EXISTS testtable (colA,colB,colC)');
db.execute('INSERT INTO testtable VALUES("田中","鈴木","高橋")');

 colAからcolCまでを宣言した順番にあわせて,人名が入っていくというわけです。db.executeはSQL文をそのまま引数として渡すことでデータベースにSQL文を処理させるという関数です。executeはGoogle Gearsによって追加実装された機能で,JavaScript自身が持っている関数ではありません。したがってこのサンプルをGoogle GearsをインストールしていないPCで実行してもエラーが発生して正しく動作しません。

 データの挿入は簡単で,上のようにINSERT文といわれるSQL文を書くだけで実装できます。フォームから入力されたデータを入れるとしても,田中や鈴木と書かれている部分に,フォームから受けたデータを押し込むだけですから,そんなに難しいというものではありません。

 問題はデータベースからデータを抜き出すという処理です。データベースからデータを取り出すにはSELECT文というSQL文を使います。

var rs = db.execute('SELECT * FROM testtable');

 このSQL文はtesttableテーブルからすべてのデータを取り出せという命令です。結果はここではrsというオブジェクトに入ります。オブジェクトというところがポイントで,そのままrsの中身を見てもデータそのものは取り出せません。ここからちょっと面倒な作業が始まります。

 まずrs.isValidRow()という関数をループします。isValidRow()はオブジェクト内の各データを表していて,最初のデータから順にデータを舐めていきます。各データのカラムの値はrs.field(n)に入っています。nは0から始まる配列の添え字です。いくつのカラムがあるのかはrs.fieldCount()で取得します。

 サンプルはすべてのカラム・データをカンマで接続したCSV形式で取得します。データベースの内容をCSVでエクスポートするという処理はとてもよくある処理なので,あえて一度CSV形式を作っているというのがサンプルです。単純に結果として<table>で書き出すだけであれば,このループ処理の中で<td>をつけて出力してしまうこともできます。

 ちょっとコード的には遠回りしていますが,一度CSVとして配列に持った内容を,最後のループで再度ほぐして<td>や<tr>をつけて画面に出力します。

 そして<table>の書き出しが完了すると,先にも書いたようにテーブルを破棄し,db.close()してプログラムを終了します。db.closeについては特に明示的に行う必要はなく,ブラウザを閉じるか別のページに移動すると接続そのものは切れるようになっています。リファレンスにも必須ではない旨明記されています。

 出したり入れたりしてみたSQLiteのデータですが,実態は下記の場所に保存されています(図5)。

図5:保存されているSQLiteのデータ・ファイル

Vistaの場合
・IE
C:\Users\ユーザー名\AppData\LocalLow
\Google\Google Gears for Internet Explorer

・Firefox
C:\Users\ユーザー名\AppData\Local\Mozilla\Firefox
\Profiles\uelib44s.default\Google Gears for Firefox

XPの場合
・IE
C:\Documents and Settings\ユーザー名\Local Settings\Application Data
\Google\Google Gears for Internet Explorer

・Firefox
C:\Documents and Settings\ユーザー名\Local Settings\Application Data
\Mozilla\Firefox\Profiles\uelib44s.default\Google Gears for Firefox

 データはバイナリ・ファイルなので,エディタなどで内容を直接見ることはできません。また注意点として,同一PCで実行していても,IEとFirefoxでは別のデータベースを見に行っているという点です。例えばIEでGearsアプリを使ってデータベースに記録したあとで,またIEで開けばデータベースから先ほどのデータを取り出すということができますが,Firefoxで開くと別のデータベースを見に行くため,IEから記録したデータは見えなくなるということです。この動作はGoogle Gearsのデータベース・サンプルを動かしても確認できます。

 各データのファイル・パスはわかっても,Explorerからたどって開こうとするとシステム・ファイル属性であるため通常のセキュリティ設定のWindowsでは見つけられない点にも注意してください。ブラウザで該当ページを表示している間はファイルがロックされていて削除できません。サンプルで作ったごみデータを削除したい場合には,ブラウザを閉じてから削除してください。データ・ファイルを削除したことで,何らかの不具合が発生するということはありません。

この先は会員の登録が必要です。有料会員(月額プラン)は登録月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら