ユーザーのパソコンに構造化された方法で(SQLite データベース エンジンに基づいて)データを保存できる Web SQL Database API は、2009 年 4 月に導入され、2010 年 11 月に廃止されました。これは WebKit(Safari の基盤)に実装され、Blink エンジン(Chrome の基盤)で引き続き有効ですが、Gecko(Firefox の基盤)ではこの機能が実装されておらず、WebKit は 2019 年に削除しました。
World Wide Web Consortium(W3C)は、ウェブ データベースを必要とするお客様に、localStorage
や sessionStorage
、または IndexedDB などの Web Storage API テクノロジーを導入することを推奨しています。これらのテクノロジーは、Key-Value ストアと構造化データに関して強みを発揮しますが、強力なクエリ言語がないなどの弱点もあります。ユーザーがウェブでの SQL を使いたいと思うのには理由があります。
Web SQL のサポート終了と削除手順
- [ 完了。]Chromium 97( 2022 年 1 月 4 日)で、Web SQL はサードパーティ コンテキストのサポートが終了し、削除されました。
- [ 完了。]安全でないコンテキストでのウェブ SQL アクセスは Chromium 105(2022 年 1 月 4 日)をもって非推奨となり、Chrome DevTools の [Issues] パネルに警告メッセージが表示されました。
- [ 完了。]安全でないコンテキストでの Web SQL アクセスは、Chromium 110(2022 年 1 月 4 日)をもってご利用いただけなくなりました。Chromium 110(2022 年 1 月 4 日)から Chromium 123(2022 年 1 月 4 日)まで、この機能を引き続き使用するためのエンタープライズ ポリシーをご利用いただけます。
- [ 完了。]すべてのコンテキストでのウェブ SQL アクセスは、Chromium 115(2022 年 1 月 4 日)をもって非推奨になり、Chrome DevTools の [Issues] パネルに警告メッセージが表示されます。
- [デプリケーション トライアルが提供されました。デプリケーション トライアルの詳細については、オリジン トライアルのスタートガイドをご覧ください。 完了。]Chromium 117(2022 年 1 月 4 日)から Chromium 123(2022 年 1 月 4 日)まで、Web SQL を引き続き使用するための
- [ 完了。]すべてのコンテキストでの Web SQL アクセスは、Chromium 119 では利用できなくなりました。
次のステップ
概要で説明したように、多くの場合は localStorage
や sessionStorage
などの Web Storage API テクノロジー、または IndexedDB 標準が適切な代替手段となりますが、必ずしもすべてのケースで利用できるわけではありません。
ストレージをウェブ デベロッパーに任せる理由
Wasm の登場により、SQL または NoSQL ソリューションがウェブに登場しました。たとえば、DuckDB-Wasm や absurd-sql です。こうした結果から、デベロッパー コミュニティはブラウザ ベンダーよりも迅速かつ効果的に新しいストレージ ソリューションを反復開発できると考えています。
Web SQL を削除するだけではありません。実際、Google はこのモデルをオープンソース コミュニティで維持されるなんらかの機能に置き換え、自由に更新できるパッケージとして提供しました。修正や新機能をブラウザに直接導入する負担はありません。私たちの目標は 開発者が独自のデータベースを ウェブに持ち込めるようにすることです
さらに、この例がオープンソース データベースの新しいエコシステムの発展に役立つことを願っています。そして最後に、ファイル システム アクセス ハンドルのリリースにより、カスタム ストレージ ソリューションを構築できる新しいプリミティブが提供されます。
Web SQL のサポートを終了する理由
サステナビリティとセキュリティに関する懸念
Web SQL 仕様はサステナブルに実装できないため、イノベーションや新機能が制限されます。標準の最後のバージョンには、文字通り「ユーザー エージェントは Sqlite 3.6.19 でサポートされている SQL 言語を実装する必要があります」と記載されています。
SQLite は当初、悪意のある SQL ステートメントを実行するように設計されていませんでしたが、Web SQL を実装すると、ブラウザでこれを正確に行う必要があります。セキュリティと安定性に関する修正を反映する必要があると、Chromium で SQLite を更新することになります。これは、SQLite 3.6.19 とまったく同じように動作するという Web SQL の要件と直接競合することになります。
API シェイプ
Web SQL は、経過時間を表示する API でもあります。2000 年代後半の子どもであるため、次のコードサンプル(Nolan Lawson 提供)が示すように、「コールバックの地獄」の好例です。ご覧のとおり、SQL ステートメント(SQLite SQL 言語を使用)は文字列としてデータベース メソッドに渡されます。
openDatabase(
// Name
'mydatabase',
// Version
1,
// Display name
'mydatabase',
// Estimated size
5000000,
// Creation callback
function (db) {
db.transaction(
// Transaction callback
function (tx) {
// Execute SQL statement
tx.executeSql(
// SQL statement
'create table rainstorms (mood text, severity int)',
// Arguments
[],
// Success callback
function () {
// Execute SQL statement
tx.executeSql(
// SQL statement
'insert into rainstorms values (?, ?)',
// Arguments
['somber', 6],
// Success callback
function () {
// Execute SQL statement
tx.executeSql(
// SQL statement
'select * from rainstorms where mood = ?',
// Arguments
['somber'],
// Success callback
function (tx, res) {
// Do something with the result
var row = res.rows.item(0);
console.log(
'rainstorm severity: ' +
row.severity +
', my mood: ' +
row.mood,
);
},
);
},
);
},
);
},
// Error callback
function (err) {
console.log('Transaction failed!: ' + err);
},
// Success callback);
function () {
console.log('Transaction succeeded!');
},
);
},
);
このコードを実行して、作成されたテーブルを Chrome DevTools で検査すると、次のようになります。
実装者によるサポートの不足
あまり知られていない API の形状(少なくとも今から見ると)とは別に、Mozilla は Web SQL が SQLite で構築されることについて、多くの懸念を抱いていました。
「Google では、[SQLite] が一般的なウェブ コンテンツに公開される API の正しい基盤であるとは考えていません。特に、SQL を有用な方法でサブセットする、信頼性が高く、広く受け入れられている標準がないためです。また、SQLite の変更が後でウェブに影響することがないようにし、ブラウザの主要なリリース(およびウェブ標準)を SQLite に採用することは賢明ではないと考えています。」
Mozilla の懸念については、元 Mozillan Vladimir Vuki 優れたビッチのブログ投稿をご覧ください。その他の履歴については、W3C Web Applications Working Group の議事録とメーリング リストのアーカイブをご覧ください(詳細については、IRC のログもお読みください)。また、Nolan Lawson のブログ投稿では、何が起こったかの概要がわかりやすく紹介されています。
フィードバック
この投稿でお知らせした非推奨の手順について懸念がある場合は、blink-dev メーリング リストでお知らせください。このグループのメンバーは、誰でも参加でき、誰でも投稿できます。
関連リンク
- ChromeStatus エントリ: サードパーティ コンテキストの WebSQL のサポート終了と削除
- ChromeStatus エントリ: 安全でないコンテキストでの WebSQL のサポート終了と削除
- サポート終了と削除の目的: サードパーティ コンテキストでの WebSQL
- サポート終了と削除の目的: 安全でないコンテキストでの WebSQL
- Chromium の問題: サードパーティのコンテキストでの WebSQL のサポート終了と削除
- Chromium の問題: 安全でないコンテキストでの WebSQL のサポート終了と削除
- Chromium の問題: WebSQL のサポート終了と削除(Window#openDatabase)
- オリジン プライベート ファイル システムを基盤とするブラウザでの SQLite Wasm
謝辞
この記事は、Joe Medley、Ben Morss、Joshua Bell によってレビューされました。