Устаревание и удаление Web SQL

API базы данных Web SQL , который позволяет структурированно хранить данные на компьютере пользователя (внутренне на основе ядра базы данных SQLite), был представлен в апреле 2009 года и прекращен в ноябре 2010 года . Хотя она была реализована в WebKit (который поддерживает Safari) и оставалась активной в движке Blink (который поддерживает Chrome), Gecko (который поддерживает Firefox) никогда не реализовывал эту функцию, и WebKit удалил ее в 2019 году .

Консорциум World Wide Web (W3C) рекомендует тем, кому нужны веб-базы данных, использовать такие технологии API веб-хранилища , как localStorage и sessionStorage или IndexedDB . Эти технологии показывают свои сильные стороны, когда речь идет о хранилищах ключей/значений и структурированных данных, но, по общему признанию, у них также есть недостатки, такие как отсутствие сильного языка запросов. Людям не без причины нужен SQL в сети.

Действия по прекращению поддержки и удалению Web SQL

  • [ Done.] Web SQL устарел и удален для сторонних контекстов в Chromium 97 (4 января 2022 г.).
  • [ Done.] Доступ к Web SQL в незащищенных контекстах был объявлен устаревшим начиная с Chromium 105 (4 января 2022 г.), после чего на панели проблем Chrome DevTools появилось предупреждающее сообщение.

Панель «Проблемы Chrome DevTools» с предупреждением о том, что Web SQL читается в незащищенных контекстах, устарела.

  • [ Done.] Доступ к Web SQL в незащищенных контекстах больше не доступен, начиная с Chromium 110 (4 января 2022 г.). Корпоративная политика , позволяющая продолжать использовать эту функцию, доступна начиная с Chromium 110 (4 января 2022 г.) до Chromium 123 (4 января 2022 г.).
  • [ Done.] Доступ к Web SQL во всех контекстах устарел, начиная с Chromium 115 (4 января 2022 г.), и на панели проблем Chrome DevTools отображается предупреждающее сообщение.
  • [ Done.] Пробная версия устаревшей версии , позволяющая продолжать использовать Web SQL, была доступна начиная с Chromium 117 (4 января 2022 г.) до Chromium 123 (4 января 2022 г.). Дополнительные сведения об устаревших пробных версиях см. в разделе Начало работы с пробными версиями Origin .
  • [ Done.] Доступ к Web SQL во всех контекстах больше не доступен в Chromium 119 .

Куда идти дальше

Как отмечалось во введении, такие технологии Web Storage API, как localStorage и sessionStorage или стандарт IndexedDB , являются хорошей альтернативой во многих, но далеко не во всех случаях.

Обоснование предоставления хранилища веб-разработчикам

С появлением Wasm в Интернете могут появиться решения SQL или NoSQL. Один пример — DuckDB-Wasm , другой — абсурд-sql . Основываясь на этих разработках, мы считаем, что сообщество разработчиков может создавать новые решения для хранения данных быстрее и лучше, чем поставщики браузеров.

Мы не планируем просто удалять Web SQL. Фактически, мы заменили его чем-то , что будет поддерживаться сообществом открытого исходного кода и служить пакетом, который можно обновлять по желанию — без бремени внесения исправлений и новых функций непосредственно в браузеры. На самом деле наша цель — позволить разработчикам разместить в Интернете свою собственную базу данных.

Более того, мы надеемся, что этот пример поможет процветать новой экосистеме баз данных с открытым исходным кодом! Выпуск дескрипторов доступа к файловой системе, наконец, предоставляет новый примитив, на котором можно создавать собственные решения для хранения данных.

Причины прекращения поддержки Web SQL

Проблемы устойчивости и безопасности

Спецификацию Web SQL невозможно реализовать устойчиво, что ограничивает инновации и новые функции. Последняя версия стандарта буквально гласит: «Пользовательские агенты должны реализовать диалект SQL, поддерживаемый Sqlite 3.6.19» .

SQLite изначально не был предназначен для выполнения вредоносных операторов SQL, однако реализация Web SQL означает, что браузеры должны делать именно это. Необходимость постоянно обновлять безопасность и стабильность диктует необходимость обновления SQLite в Chromium. Это прямо противоречит требованию Web SQL вести себя точно так же, как SQLite 3.6.19.

Форма API

Web SQL также является API, который показывает свой возраст. Будучи ребенком конца 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 , результат будет следующий:

Проверка раздела Web SQL в Chrome DevTools показывает базу данных под названием mydatabase с таблицей под названием Rainstorms со столбцами «настроение» (текстовое) и «серьезность» (целое число), в которой есть одна запись с мрачным настроением и уровнем серьезности, равным шести.

Отсутствие поддержки со стороны разработчиков

Помимо загадочной формы API (по крайней мере, с сегодняшней точки зрения), у Mozilla было много опасений по поводу того, что Web SQL построен на базе SQLite:

«Мы не думаем, что [SQLite] является подходящей основой для API, доступного для общего веб-контента, не в последнюю очередь потому, что не существует надежного, широко распространенного стандарта, который полезным образом разделял бы SQL. Я не хочу, чтобы изменения в SQLite впоследствии повлияли на Интернет, и не думаю, что использование основных версий браузеров (и веб-стандартов) для SQLite будет разумным».

Вы можете прочитать об опасениях Mozilla в блоге бывшего Mozillan Владимира Вукичевича . Чтобы узнать больше об истории, ознакомьтесь с протоколами рабочей группы W3C по веб-приложениям (и, если вы действительно хотите вдаваться в подробности, прочтите журналы IRC ) и архивами списков рассылки ). Кроме того, сообщение в блоге Нолана Лоусона дает хороший обзор того, что произошло.

Обратная связь

Если у вас есть какие-либо опасения по поводу шагов по прекращению поддержки, описанных в этом посте, сообщите нам об этом в списке рассылки Blink-dev . Членство в этой группе открыто для всех, и каждый может публиковать сообщения.

Благодарности

Эту статью рецензировали Джо Медли , Бен Морсс и Джошуа Белл .