HTML5 Web SQL データベース

Web SQL の状態:Web SQL API は非推奨となり、使用は推奨されません。新しいブラウザ標準では、クライアント側ストレージとして IndexedDB を使用することが推奨されています。Web SQL は一部の古いブラウザでのみサポートされています。

代替案: Web SQL の将来は不確実であり、広くサポートされていないため、トランザクションとキーバリューストアをサポートする最新のブラウザ API である IndexedDB への移行を推奨します。

Web SQL データベース API は HTML5 仕様の一部ではありませんが、独立した仕様であり、SQL を使用してクライアント側データベースを操作する一連の API を導入しています。

Web バックエンドプログラマーであれば、SQL の操作を簡単に理解できるはずです。

参考として、私たちのSQL チュートリアル、データベース操作の知識をさらに深めることができます。

Web SQL データベースは、最新版の Safari、Chrome、Opera ブラウザーで動作します。


コアメソッド

以下は仕様で定義されている 3 つのコアメソッドです:

  1. openDatabase:このメソッドは、既存のデータベースまたは新しく作成したデータベースを使用してデータベースオブジェクトを作成します。
  2. transaction:このメソッドを使用すると、トランザクションを制御し、状況に応じてコミットまたはロールバックを実行できます。
  3. executeSql:このメソッドは、実際の SQL クエリを実行するために使用されます。

データベースを開く

openDatabase() メソッドを使用して既存のデータベースを開くことができます。データベースが存在しない場合は、新しいデータベースが作成されます。コードは次のとおりです:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);

openDatabase() メソッドに対応する 5 つのパラメータの説明:

  1. データベース名
  2. バージョン番号
  3. 説明テキスト
  4. データベースサイズ
  5. 作成コールバック

5 番目のパラメータである作成コールバックは、データベース作成後に呼び出されます。


クエリ操作を実行する

操作の実行には database.transaction() 関数を使用します:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); });

上記のステートメントを実行すると、'mydb' データベースに LOGS という名前のテーブルが作成されます。


データを挿入する

上記のテーブル作成ステートメントを実行した後、いくつかのデータを挿入できます:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "サンプル")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "www.example.com")'); });

動的な値を使用してデータを挿入することもできます:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); tx.executeSql('INSERT INTO LOGS (id,log) VALUES (?, ?)', [e_id, e_log]); });

例の e_id と e_log は外部変数です。executeSql は配列パラメータの各エントリを "?" にマッピングします。


データを読み取る

次の例は、データベースに既に存在するデータを読み取る方法を示しています。

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "サンプル")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "www.example.com")'); }); db.transaction(function (tx) { tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { var len = results.rows.length, i; msg = "<p>レコード数を照会:" + len + "</p>"; document.querySelector('#status').innerHTML += msg; for (i = 0; i < len; i++){ alert(results.rows.item(i).log ); } }, null); });

完全な例

例

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); var msg; db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "サンプル")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "www.example.com")'); msg = '<p>データテーブルが作成され、2 つのデータが挿入されました。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { var len = results.rows.length, i; msg = "<p>レコード数を照会:" + len + "</p>"; document.querySelector('#status').innerHTML += msg; for (i = 0; i < len; i++){ msg = "<p><b>" + results.rows.item(i).log + "</b></p>"; document.querySelector('#status').innerHTML += msg; } }, null); });

やってみる »

上記の例の実行結果は次の図のとおりです。


レコードを削除する

レコードを削除する形式は次のとおりです。

db.transaction(function (tx) {
    tx.executeSql('DELETE FROM LOGS  WHERE id=1');
});

削除する指定データの id は動的にすることもできます:

db.transaction(function(tx) {
    tx.executeSql('DELETE FROM LOGS WHERE id=?', [id]);
});

レコードを更新する

レコードを更新する形式は次のとおりです。

db.transaction(function (tx) {
    tx.executeSql('UPDATE LOGS SET log=\'www.w3cschool.cc\' WHERE id=2');
});

更新する指定データの id は動的にすることもできます:

db.transaction(function(tx) {
    tx.executeSql('UPDATE LOGS SET log=\'www.w3cschool.cc\' WHERE id=?', [id]);
});

完全な例

例

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); var msg; db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "サンプル")'); tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "www.example.com")'); msg = '<p>データテーブルが作成され、2 つのデータが挿入されました。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('DELETE FROM LOGS WHERE id=1'); msg = '<p>id が 1 のレコードを削除しました。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('UPDATE LOGS SET log=\'www.w3cschool.cc\' WHERE id=2'); msg = '<p>id が 2 のレコードを更新しました。</p>'; document.querySelector('#status').innerHTML = msg; }); db.transaction(function (tx) { tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { var len = results.rows.length, i; msg = "<p>レコード数を照会:" + len + "</p>"; document.querySelector('#status').innerHTML += msg; for (i = 0; i < len; i++){ msg = "<p><b>" + results.rows.item(i).log + "</b></p>"; document.querySelector('#status').innerHTML += msg; } }, null); });

やってみる »

上記の例の実行結果は次の図のとおりです。

その他の拡張