Запуск PostgreSQL внутри браузера с помощью PGLite

Благодаря WebAssembly мы теперь можем использовать PostgreSQL в браузере, чтобы создавать реактивные приложения, работающие в реальном времени, локальные приложения прямо на Postgres. PGLite собирается сделать это еще проще.

До недавнего времени единственным способом запустить PostgreSQL в браузере было развертывание виртуальной машины, что мы рассмотрели в статье "Запуск PostgreSQL в браузере":

Crunchy Data, создав виртуальную машину v86 на основе образа Alpine Linux и установив на нее Postgres, смогли запустить его в браузере, поскольку v86 эмулирует x86-совместимый процессор и аппаратное обеспечение, транслируя машинный код в WebAssembly во время выполнения.

Однако у такого подхода есть два ограничения: нет доступа к Интернету из виртуальной машины и нет сохранения данных, поэтому изменения теряются при выходе или обновлении страницы.

Последним недостатком воспользовалась компания Cruncy Data, создав на его основе эфемерные игровые площадки, которые позволяют вам практиковать SQL в браузере, а затем просто отпустить их, когда они закончены.

Но благодаря PGlite ситуация скоро изменится. PGlite - это сборка WASM Postgres, упакованная в клиентскую библиотеку TypeScript, которая позволяет запускать Postgres в браузере без необходимости установки каких-либо других зависимостей. То есть Postgres заступает на место SQLite, выступая в роли библиотеки, которая может быть вызвана кодом, с дополнительным бонусом в виде возможности сохранять данные в файловой системе (Node/Bun) или в индексированной БД (Browser).

Кроме того, поскольку PGLite основана на ElectricSQL, она может синхронизироваться с сервером по требованию, что дает возможность создавать действительно реактивные и локальные приложения. Это единственное свойство делает PGLite частью движения за суверенитет данных, которое звучит примерно следующим образом: "Если вы не владеете данными или они не хранятся на ваших собственных устройствах, то они не ваши".

Чтобы наглядно привыкнуть к идее Postgres- как библиотеки, которую мы можем вызывать и использовать из Javascript-кода, мы можем сделать следующее:

import { PGlite } from "@electric-sql/pglite";

const db = new PGlite();
await db.query("select 'Hello world' as message;");

Теперь вы можете выполнять SQL-запросы в Postgres, как раньше в SQLite.

console.log("Создание таблицы...");
await pg.query(`
CREATE TABLE IF NOT EXISTS test (
id SERIAL PRIMARY KEY,
имя TEXT
); `);

console.log("Вставка данных...");
await pg.query("INSERT INTO test (name) VALUES ('test');");

console.log("Выборка данных...");
const res = await pg.query(`
SELECT * FROM test;`);

Это делает PGLite полезным в целом ряде различных сценариев:

  • Его можно использовать в автономном режиме и синхронизировать с удаленным сервисом при переходе в онлайн, или когда постоянное подключение к данным не гарантировано - не предполагайте, что на бэкенде всегда есть облако.
  • Его можно использовать в качестве базы данных in-memory для тестирования кода вместо SQLite. Это также избавляет от несовместимости при проведении тестирования с использованием SQLite и последующей попытке загрузить базу данных SQLite в PostgreSQL. Эти несовместимости сводятся к следующему:
  • Различия в типизации (SQLite и Postgres используют разные типы).
  • Котировка идентификаторов (Несоответствие в некоторых случаях между тем, как PostgresSQL и Sqlite цитируют свои объекты).
  • Прощающий синтаксис SQL (SQLite более мягко относится к синтаксическим ошибкам в некоторых SQL-операторах, а Postgres - нет).

Другим преимуществом PGLite по сравнению с порождением виртуальной машины является небольшой размер; он составляет всего 3,7 МБ в gzipped формате, в то время как версия виртуальной машины занимает 30+ МБ.

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

Однако программы, скомпилированные с помощью Emscripten - компилятора C to WebAssembly (WASM) - не могут создавать новые процессы, и поэтому работают строго в однопроцессном режиме. В результате PostgreSQL не может быть напрямую скомпилирован в WASM для работы в обычном режиме.

К счастью, в Postgres предусмотрен "однопользовательский режим", предназначенный в первую очередь для использования командной строки во время загрузки и восстановления. Опираясь на эту возможность, PGlite предоставляет путь ввода/вывода, который облегчает взаимодействие с PostgreSQL, когда он компилируется в WASM в среде JavaScript.

Кроме того, PGLite не может запускать расширения, пока(?). Возможно, это слишком много, но представьте, что вы запускаете PostGIS на портативном веб-базированном Postgres и с вашими собственными данными.

В общем, PGLite - это последнее дополнение к движению Postgres-for-everything и его цель - перенести PostgresSQL на клиентскую сторону!

Запуск PostgreSQL внутри браузера с помощью PGLite
Понравилась новость? Тогда не забудь оставить свой комментарий.
А так же, добавь наш сайт в закладки (нажми Ctrl+D), не теряй нас.
19 марта 2024 г.
122
Теги: PostgreSQL , WebAssembly , PGLite

Комментарии

Оставить комментарий:
* отправляя форму, я даю согласие на обработку персональных данных

Читайте еще