Web SQL の非推奨化と削除

ユーザーのパソコンに構造化された方法で(SQLite データベース エンジンに基づいて)データを保存できる Web SQL Database API は、2009 年 4 月に導入され、2010 年 11 月に廃止されました。これは WebKit(Safari の基盤)に実装され、Blink エンジン(Chrome の基盤)で引き続き有効ですが、Gecko(Firefox の基盤)ではこの機能が実装されておらず、WebKit は 2019 年に削除しました

World Wide Web Consortium(W3C)は、ウェブ データベースを必要とするお客様に、localStoragesessionStorage、または 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] パネルに警告メッセージが表示されました。

Chrome DevTools の [Issues] パネルに、セキュアでないコンテキストで Web SQL が表示されるという警告が表示される機能は、非推奨になりました。

  • [ 完了。]安全でないコンテキストでの 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 では利用できなくなりました。

次のステップ

概要で説明したように、多くの場合は localStoragesessionStorage などの Web Storage API テクノロジー、または IndexedDB 標準が適切な代替手段となりますが、必ずしもすべてのケースで利用できるわけではありません。

ストレージをウェブ デベロッパーに任せる理由

Wasm の登場により、SQL または NoSQL ソリューションがウェブに登場しました。たとえば、DuckDB-Wasmabsurd-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 で検査すると、次のようになります。

Chrome DevTools の [Web SQL] セクションを調べると、mydatabase というデータベースに、mod(テキスト)と severity(整数)という列を含む「rainstorys」というテーブルがあることがわかります。1 つのエントリは「暗い気分」で、重大度は 6 です。

実装者によるサポートの不足

あまり知られていない 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 メーリング リストでお知らせください。このグループのメンバーは、誰でも参加でき、誰でも投稿できます。

謝辞

この記事は、Joe MedleyBen MorssJoshua Bell によってレビューされました。