Web SQL の非推奨化と削除

Web SQL Database API は、ユーザーのコンピュータ上に(内部的には SQLite データベース エンジンに基づいて)構造化された形でデータを保存できるもので、2009 年 4 月に導入され、2010 年 11 月に廃止されました。これは WebKit(Safari に搭載)に実装され、Blink エンジン(Chrome に搭載)で引き続き有効でしたが、Gecko(Firefox に搭載)ではこの機能を実装することはなく、WebKit は 2019 年にこの機能を削除しました

World Wide Web Consortium(W3C)は、ウェブ データベースを必要とする企業に対して、localStoragesessionStorageIndexedDB などの Web Storage API テクノロジーの導入を奨励しています。これらのテクノロジーは、Key-Value ストアと構造化データに関して強みを示していますが、強力なクエリ言語がないなどの弱点もあります。人々がウェブで SQL を求めるのはそのためです。

Web SQL のサポート終了と削除の手順

  • [完了]Chromium 97(2022 年 1 月 4 日)以降、サードパーティ コンテキスト用の Web SQL は非推奨になり、削除されました。
  • [完了]安全でないコンテキストでの Web SQL アクセスは Chromium 105(2022 年 1 月 4 日)をもってサポートが終了し、その時点で Chrome DevTools の [Issues] パネルに警告メッセージが表示されていました。

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

  • [完了]安全でないコンテキストでの Web SQL アクセスは、Chromium 110(2022 年 1 月 4 日)以降ご利用いただけなくなりました。この機能を引き続き使用するためのエンタープライズ ポリシーは、Chromium 110(2022 年 1 月 4 日)から Chromium 123(2022 年 1 月 4 日)まで適用されます。
  • [完了]すべてのコンテキストでの Web SQL アクセスは Chromium 115(2022 年 1 月 4 日)をもって非推奨となり、Chrome DevTools の [Issue] パネルに警告メッセージが表示されます。
  • [ ご利用をお待ちしております。]Web SQL を引き続き使用するための非推奨トライアルは、Chromium 117(2022 年 1 月 4 日)から Chromium 123(2022 年 1 月 4 日)までご利用いただけます。非推奨トライアルの詳細については、オリジン トライアルのスタートガイドをご覧ください。

次のステップ

最初に述べたように、localStoragesessionStorage などの Web Storage API テクノロジー、または IndexedDB 標準が、多くのケースで優れた代替手段となります。ただし、すべてのケースがそうであるとは限りません。

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

Wasm の登場により、SQL または NoSQL ソリューションがウェブに導入できるようになりました。1 つの例は DuckDB-Wasm で、もう 1 つは absurd-sql です。こうした作成により、デベロッパー コミュニティはブラウザ ベンダーよりも迅速かつ優れた新しいストレージ ソリューションを繰り返し開発できると考えています。

Web SQL を削除する予定はありません。実際、オープンソース コミュニティが管理するものに置き換え、自由に更新できるパッケージとして提供しました。修正や新機能をブラウザに直接導入する負担はありません。開発者がウェブに独自のデータベースを 導入できるようにすることが目的です

さらに、この例がオープンソース データベースの新しいエコシステムの発展に役立つことを願っています。ファイル システム アクセス ハンドルのリリースにより、カスタム ストレージ ソリューションを構築できる新しいプリミティブがついに提供されます。

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 です。次のコードサンプル(Nolan Lawson 提供)が示すように、これは 2000 年代後半の子供であったため、「コールバック地獄」の好例です。ご覧のとおり、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 というデータベースに「rainsparks」というテーブルがあります。このテーブルには、mood(テキスト)と severity(整数)の列があり、1 つのエントリは重苦しい気分、重大度 6 です。

実装担当者によるサポートの欠如

Mozilla は、Web SQL が SQLite で構築されていることについて、難解な API の形式(少なくとも現在の視点から)を除けば、次のような多くの懸念を抱えていました。

「[SQLite] は、一般的なウェブ コンテンツを公開する API の適切な基盤ではないと考えています。特に、SQL のサブセットを有用な方法でサブセット化する信頼できる広く受け入れられている標準が存在しないためです。また、SQLite の変更が後でウェブに影響しないようにするために、ブラウザのメジャー リリース(およびウェブ標準)を SQLite に利用することは賢明ではないと考えています。」

Mozilla の懸念については、旧 Mozillan Vladimir Vuki 特別な vi 前のブログ投稿をご覧ください。詳しい歴史については、W3C ウェブ アプリケーション ワーキング グループの議事録をご覧ください(詳細については、IRC ログメーリング リストのアーカイブをご覧ください)。また、Nolan Lawson のブログ投稿でも問題の概要が説明しています。

フィードバック

この投稿でお知らせした非推奨手順について不明な点がある場合は、blink-dev メーリング リストでお知らせください。このグループのメンバーは誰でも参加でき、誰でも投稿できます。

謝辞

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