トップページ >  HTML5 >  Web SQL Database
初版2011/08/20: 最終更新日2011/08/20
Web SQL Database
目次
Web SQL Databaseとは
Web SQL Databaseの使い方
Web SQL Databaseとは

Web SQL Databaseは、クライアントサイドでリレーショナルデータベースを利用するためのインターフェースAPIです。
文献の多くは「Web SQL Database」と言うと、この「Web SQL Database」を指すものがほとんどです。
SQLを用いた柔軟なデータアクセス(SQLite3に準拠したSQL)を行えます。

データベースの各種の操作をSQLで記述できるので、かなり複雑な検索が可能であり、Webアプリケーションのさまざまなデータを保存するのに適しています。

ただし、リレーショナル・データベースの世界では、製品ごとに、SQLに細かな文法の違いがあり、互換性を保ちきれない面があります。
例) 外部結合の書式がベンダーによって異なるなど 同様のことがWeb SQL Databaseでも起こることが予想されるため、Webブラウザ・ベンダーによって対応状況に差があります。
このため、W3CのWeb SQL Databaseの仕様を見ると、「This specification has reached an impasse」(この仕様は袋小路に入った)といった記述があります。
つまり、現時点(2011年8月)では、仕様策定が停滞状態です。

各ブラウザの対応

Web SQL Databaseは、2011年8月現在以下のブラウザで対応しています。
Safari 5~、Opera 10.6.2~、Google Chrome 10~

Web SQL Databaseの使い方

Web SQL Databaseの使い方は、PHPなどに似ています。
まず、データベースに接続し、トランザクション内で、SQL文(DDL/DML)を実行します。

データベースに接続する

「openDatabase」関数で、データベースに接続します。
接続したデータベースオブジェクトが返り値となります。

openDatabase(データベース名, バージョン, 表示名, 見込み容量)
第1引数 : データベース名
データベースに付ける名前
第2引数 : バージョン
データベースのバージョン番号
このパラメータを指定した場合、データベースのバージョンがパラメータ値に合っていなければ、データベースを開くことができない。
このパラメータに空文字を指定すれば、バージョンに関係なくデータベースを開くことができる。
第3引数 : 表示名
ユーザーに見せるデータベースの名前
Webブラウザによってはデータベース管理機能があることもあり、その画面にはこの名前が表示されることがある。
第4引数 : 見込み容量
データベースに概ね見込まれる容量(バイト単位)

トランザクションを開始する

データベースオブジェクトの「transaction」メソッドを実行します。
なお「transaction」メソッドの引数は全てコールバック関数となります。

(データベースオブジェクト).transaction(SQLコールバック, エラー時コールバック, 成功時コールバック)
第1引数 : SQLコールバック
トランザクション内で実行されるSQL処理を定義します。
匿名関数でも、別途定義の関数でも構いません。
コールバック関数の第1引数は、トランザクションオブジェクトになります。
第2引数 : エラー時コールバック
トランザクションが失敗した場合の例外処理を定義します。
匿名関数でも、別途定義の関数でも構いません。
省略しても構いません。
コールバック関数の第1引数は、エラーオブジェクトになります。
第3引数 : 成功時コールバック
トランザクションが成功した場合の後処理を定義します。
匿名関数でも、別途定義の関数でも構いません。
省略しても構いません。

SQLコールバックを定義する

トランザクション内で実行されるSQL処理を定義します。
主にトランザクションオブジェクトの「executeSql」メソッドなどを実行します。

(トランザクションオブジェクト).executeSql(SQL文, 値, 成功時コールバック, 失敗時コールバック)
第1引数 : SQL文
実行するSQLの文を定義します。
例)
SELECT * FROM USER_TABLE;
第2引数 : 置換する値
SQL文に「?」でプレース・ホルダーを入れる場合に、そのプレース・ホルダーを置き換える値の配列を指定します。
例)以下のようなSQL文の場合、?部分は置換することができます。
INSERT INTO USER_TABLE (key, val) VALUES (?, ?);
値に['k1','value']と指定して値を後から指定します。
第3引数 : 成功時コールバック
トランザクションが成功した場合の後処理を定義します。
匿名関数でも、別途定義の関数でも構いません。
省略しても構いません。
コールバック関数の第1引数は、トランザクションオブジェクトになります。
第2引数は、レコードセットオブジェクトになります。
レコードセットオブジェクトのプロパティは以下の通りです。
insertId
レコードのID(INSERT命令を実行した場合)
rowsAffected
影響があったレコードの数(UPDATE/DELETE命令を実行した場合)
rows
読み込んだレコードオブジェクトの配列(SELECT命令を実行した場合)
rows.length
読み込んだレコード数
rows[n]
n番目の読み込んだレコードオブジェクト
rows[n].(フィールド名)
n番目の読み込んだレコード内の指定フィールドの値。
第4引数 : エラー時コールバック
トランザクションが失敗した場合の例外処理を定義します。
匿名関数でも、別途定義の関数でも構いません。
省略しても構いません。
コールバック関数の第1引数は、エラーオブジェクトになります。

リスト1. Web SQL Databaseの例

// DBに接続。
var db = openDatabase("dbname", "", "My DB", 1024*1024);
// トランザクション開始
db.transaction(
	function(tx){
		// SQL
		tx.executeSql(
			"SELECT * FROM mytable;",
			[],
			function(tx,rs){
				// 成功時のコールバック
				var p = getElementById("result");
				for( var i=0; i < rs.length; i++){
					var str = "";
					var f1 = rs.rows[i].field1;
					var f2 = rs.rows[i].field2;
					str = "row[" + i + "]:"
						+ "field1=" + f1 + ", "
						+ "field2=" + f2 + "<br/>\n";
					p.innerHTML += str;
				}
			},
			function(error){
				// 失敗時のコールバック
				var p = getElementById("result");
				p.innerHTML += '<span class="error">'
							+  error.message
							+  "</span>";
			}
		);
	},
	function(error){
		// エラー時コールバック
		alert("エラー発生! " + error.message);
	},
	function(){
		// 成功時コールバック
		alert("大成功!");
	}
);