- Dans les apps local-first et les environnements de développement basés sur le navigateur, il permet d’exécuter Postgres complet directement en WASM, ce qui réduit la dépendance aux serveurs
- Proposé sous la forme d’un build de moins de 3 Mo une fois compressé avec Gzip, facile à embarquer dans le navigateur et en local
- Grâce au chargement dynamique d’extensions, il permet d’utiliser des extensions Postgres comme pgvector et PostGIS
- Il intègre le chargement de données, la synchronisation et des primitives de live query, ce qui le rend adapté aux apps réactives et aux cas d’usage en temps réel
- Le service database.build de Supabase, basé sur PGlite, offre une expérience permettant de créer et publier des bases de données Postgres avec l’aide de l’IA
Postgres pour le navigateur et le local
- PGlite est un Postgres embarqué qui exécute localement une base de données Postgres complète en WASM
- C’est un build WASM complet de Postgres, proposé en moins de 3 Mo une fois compressé avec Gzip
- Il intègre le chargement de données, la synchronisation et des primitives de live query, ce qui permet de mettre en place des flux de données réactifs centrés sur le client
Extensions et environnement d’expérimentation
- Il prend en charge un mécanisme de chargement dynamique d’extensions
- Inclut pgvector
- PostGIS peut aussi être utilisé
- Vous pouvez tester davantage d’extensions dans le Playground
- Sur la page actuelle, vous pouvez essayer immédiatement PGlite Postgres complet exécuté dans le navigateur, avec pgvector inclus
Documentation et canaux de distribution
- Vous pouvez consulter la documentation de démarrage dans Get Started
- Le GitHub affiche 15,5 K étoiles
- Le NPM affiche 10,1 M de téléchargements hebdomadaires
database.build de Supabase
- database.build est un service créé par Supabase sur la base de PGlite
- Il propose un parcours pour créer et publier une base de données Postgres avec l’IA
1 commentaires
Commentaires sur Hacker News
J’avais déjà vu que ça tournait dans le navigateur, et le fait que ce soit possible avec à peine 3 Mo de téléchargement m’avait impressionné, mais j’étais passé à côté du fait que cela fonctionne aussi côté serveur avec Node.js et Bun : https://pglite.dev/docs/
Comme il ne s’agit pas de lancer un vrai serveur réseau, ça donne l’impression d’une alternative à SQLite, et je trouve intéressant de pouvoir démarrer directement une implémentation in-process de PostgreSQL avec persistance sur disque dans une application Node.js/Bun existante
J’aimerais aussi l’essayer en Python avec des wrappers comme https://github.com/wasmerio/wasmer-python ou https://github.com/bytecodealliance/wasmtime-py, et je me demande si quelqu’un a déjà fait tourner PGlite de cette manière
Nous travaillons sur deux approches : l’une est une version WASI d’une API bas niveau que les utilisateurs peuvent envelopper dans une API de plus haut niveau, et l’autre est libpglite, qui peut être liée depuis des langages natifs
La plupart des langages ont déjà une implémentation du protocole wire de Postgres, donc envelopper une API bas niveau qui lit et émet ce protocole est relativement simple, et c’est aussi ainsi que fonctionne la partie JS de PGlite
subprocesspour exécuterexecetqueryde@electric-sql/pglite, puis d’échanger les résultats en JSONLa structure consiste à créer une instance PGlite dans
db.js, à recevoir le SQL et les paramètres via les arguments de ligne de commande, puis à appeler dansmain.pynode db.js exec ...ounode db.js query ...Pyodide est un port Wasm de CPython et permet d’interagir avec des objets JavaScript via des proxys
Dans l’exemple, on crée
globalThis.db = new PGlite(), puis on fait unawaitsurjs.db.query()dans du code Python pour exécuterSELECT 'Hello, world!' AS "greeting";, et cela fonctionne actuellement sur Node.js 18, Deno 1 et Bun 1Par exemple, je me demande si on peut l’utiliser dans un projet commercial sans publier le code source, ou si l’embarquer oblige à adapter la licence en fonction de pg/fb
Si j’en ai besoin tout de suite, je regarderai moi-même, mais certains aspects de la simplicité de SQLite qui me gênent ressemblent beaucoup à ce que je n’aime pas dans MySQL/MariaDB, donc ça m’intrigue
Je ne sais pas comment la couche de persistance de PostgreSQL a été modifiée, mais par rapport à l’exécution de PostgreSQL dans un conteneur Docker, il semble possible qu’il y ait des limites
SQLite n’a pas ce genre de contraintes
J’aime vraiment beaucoup PGlite
C’est la solution parfaite pour disposer de Postgres sans Docker, et le simple
npm installpermet de créer une instance Postgres sur une machine locale, ce qui rend l’onboarding de nouveaux développeurs dans l’équipe très simpleCela fonctionne aussi très bien avec Next.js, et je l’utilise avec un boilerplate Next.js en local et en environnement de développement : https://github.com/ixartz/Next-js-Boilerplate
Avec un seul
npm install, on obtient une application full stack avec la base de données incluse, c’est-à-dire un Postgres fonctionnel, sans avoir à installer d’outils externesdocker compose, mais ça ressemble clairement à une alternative très élégantePour éviter que la personne suivante ait à le chercher ou à poser la question : la persistance côté navigateur prend en charge IndexedDB et OPFS : <https://pglite.dev/docs/filesystems>
En voyant le titre, ma première pensée a été : « ça irait vraiment très bien avec ElectricSQL », donc c’est agréable de voir que cela vient effectivement d’ElectricSQL
L’expérience développeur immédiate est excellente, et j’aimerais essayer PGlite et ElectricSQL dans un projet de production
J’ai l’impression que cela réduirait plusieurs irritants que je rencontre actuellement, et personnellement j’aime aussi travailler avec les CRDT
Félicitations pour le Show HN
Je suivais le serveur Discord d’ElectricSQL et j’étais particulièrement intéressé par son usage depuis d’autres langages que TypeScript, donc je suis ravi d’apprendre que l’indépendance vis-à-vis du langage est une priorité
J’avais vu qu’ElectricSQL était en cours de réécriture à cause d’un changement d’architecture, et je me demande si cela affecte PGlite, ou si c’est désormais un projet séparé
Et puis SQLite est en réalité SQL-ite, c’est-à-dire de la famille des
-itecomme urbanite, mais à cause de la réanalyse et de la libfixation, on dirait que les gens l’emploient maintenant comme si c’était le suffixe-liteC’est peut-être parce que
litea un sens plus clair alors queiten’en a pas, un peu comme helicopter était à l’origine helic + opter, mais que les gens l’ont compris comme heli + copter, ce qui a donné des mots comme helipad ou quadcopter[0] https://en.wikipedia.org/wiki/Rebracketing
[1] https://en.wikipedia.org/wiki/Libfix
Les changements côté Electric vont dans le sens d’une pile plus faiblement couplée, au lieu de l’ancienne pile très intégrée
PGlite est l’un des stockages client possibles pour Electric sync, et répond à des cas d’usage où l’on veut une base SQL complète côté client, avec éventuellement le même schéma sur le client et le serveur
Le nom est évidemment un hommage à SQLite, et le
lminuscule sert à se distinguer légèrement tout en suggérant “light”, avec aussi l’idée d’un Postgres légerAvant, j’aurais dit que la principale différence entre PostgreSQL et SQLite était que SQLite est in-process, mais si les deux peuvent désormais l’être, je me demande s’il existe une comparaison plus détaillée entre eux
Dans quels cas faudrait-il préférer l’un à l’autre ?
memory access out of boundsMême si son grand frère PostgreSQL est l’une des bases de données les plus robustes qui soient, il est peut-être encore trop tôt pour le considérer prêt pour la production
Cela dit, j’ai aussi vu et rencontré des problèmes avec SQLite, donc il n’existe pas de logiciel sans bug
J’ai récemment utilisé pglite pour des tests d’intégration d’API dans un side project, et ça a plutôt bien marché
L’expérience développeur était bien meilleure que d’utiliser quelque chose comme testcontainers[0] pour lancer postgres dans Docker
[0]: https://testcontainers.com
Des projets comme Drizzle ORM en tirent déjà bien parti
L’équipe Supabase a créé pg-gateway(https://github.com/supabase-community/pg-gateway), ce qui permet de se connecter à PGlite depuis n’importe quel client Postgres, et cela pourrait en faire une solution utilisable en CI
Ce que j’aimerais explorer, c’est un VFS au niveau page avec copy-on-write pour PGlite
Si l’on pouvait démarrer PGlite avec un jeu de données chargé, puis fork instantanément la base pour chaque test, on pourrait avoir des forks en moins d’une milliseconde par test, sans la complexité des devcontainers ou des bases de données modèles de Postgres
Aujourd’hui, en production, nous utilisons postgres, mais nous exportons un schéma compatible SQLite pour des tests d’intégration basés sur SQLite
Cela nous permet d’avoir des tests d’intégration en moins d’une seconde, sans dépendances, tout en utilisant une vraie base de données
Si nous pouvions utiliser Postgres tel quel, ce serait encore mieux, car nous pourrions aussi tester les fonctionnalités qui nécessitent des fonctionnalités spécifiques à PG comme la recherche plein texte
PGlite / ElectricSQL est une technologie que j’aimerais vraiment utiliser dans un futur poste
La capacité à répliquer et à s’abonner aux changements dans le navigateur paraît extrêmement puissante
J’ai déjà développé un logiciel médical qui gérait la charge de travail de plus de 2 millions de patients, avec renouvellement de traitements liés à la chimiothérapie, au VIH et à l’immunologie, et il arrivait souvent que des personnes se marchent dessus pendant le traitement des assurances ou lors des appels avec les patients
À cause d’IE7, nous avions dû construire notre propre système de verrouillage basé sur des fonctions d’intervalle et des websockets, et pendant qu’une personne appelait un patient, le responsable de l’aide financière ne pouvait pas travailler sur le même profil
Il semble aussi possible d’exploiter localement la recherche plein texte ou la recherche vectorielle, qui coûtent très cher à grande échelle
C’est un très mauvais choix pour un logiciel médical
Je me demande s’il existe une version native de quelque chose de similaire
J’aimerais que ce soit un modèle qui m’évite de devoir jeter toute l’architecture et repartir de zéro si, plus tard, je veux créer une application native
Sur le site et dans la documentation, je ne vois que la version WASM
Nous voulons extraire les changements fondamentaux qu’il a fallu apporter à Postgres afin de créer une bibliothèque C
libpgliteque l’on pourrait lier depuis n’importe quel langage ou plateformeReact Native n’a pas de support WASM, donc cette prise en charge est importante
Avoir une live query API réactive, c’est vraiment génial
La plupart des exemples de requêtes réactives sont très basiques, comme sur une seule table, donc je me demande si les live queries prennent aussi en charge les jointures ou les agrégations
Nous stockons la requête comme une vue, puis nous inspectons en interne de quelles tables elle dépend
Ensuite, nous surveillons les changements avec
pg_notifyPour rendre cela plus efficace, nous prévoyons d’intégrer pg_ivm(https://github.com/sraoss/pg_ivm)