Postgres WASM yang berjalan di dalam browser, PGlite
(pglite.dev)- Di aplikasi yang mengutamakan lokal dan lingkungan pengembangan berbasis browser, Postgres lengkap dapat dijalankan langsung sebagai WASM sehingga ketergantungan pada server bisa dikurangi
- Tersedia sebagai build di bawah 3MB dalam ukuran Gzip, sehingga mudah di-embed ke browser maupun lingkungan lokal
- Melalui pemuatan ekstensi dinamis, ekstensi Postgres seperti pgvector dan PostGIS dapat digunakan
- Memiliki primitif bawaan untuk pemuatan data, sinkronisasi, dan live query, sehingga cocok untuk aplikasi reaktif dan use case real-time
- database.build dari Supabase, berbasis PGlite, menghadirkan pengalaman membuat dan memublikasikan database Postgres dengan bantuan AI
Postgres untuk browser dan lokal
- PGlite adalah Postgres tertanam yang menjalankan database Postgres lengkap secara lokal di WASM
- Ini adalah build WASM Postgres yang lengkap, sekaligus tersedia dalam ukuran di bawah 3MB setelah kompresi Gzip
- Memiliki primitif bawaan untuk pemuatan data, sinkronisasi, dan live query, sehingga dapat membangun alur data reaktif yang berpusat pada klien
Ekstensi dan lingkungan eksperimen
- Mendukung mekanisme pemuatan ekstensi dinamis
- Termasuk pgvector
- PostGIS juga dapat digunakan
- Lebih banyak ekstensi dapat dicoba di Playground
- Anda dapat langsung mencoba PGlite Postgres lengkap yang berjalan di dalam browser pada halaman saat ini, termasuk pgvector
Dokumentasi dan kanal distribusi
- Dokumentasi awal tersedia di Get Started
- GitHub menampilkan 15.5K bintang
- NPM menampilkan 10.1M unduhan mingguan
database.build dari Supabase
- database.build adalah layanan yang dibuat Supabase berbasis PGlite
- Menyediakan alur untuk membuat dan memublikasikan database Postgres dengan AI
1 komentar
Opini Hacker News
Dulu saya pernah melihat ini berjalan di browser dan terkesan karena bisa dilakukan hanya dengan unduhan sekitar 3MB, tetapi saya melewatkan fakta bahwa ini juga berjalan di sisi server dengan Node.js dan Bun: https://pglite.dev/docs/
Karena ini tidak menjalankan server jaringan sungguhan, rasanya seperti alternatif untuk SQLite, dan menarik bahwa kita bisa langsung menjalankan implementasi PostgreSQL in-process yang dipersistenkan ke disk di dalam aplikasi Node.js/Bun yang sudah ada
Saya juga ingin mencobanya di Python dengan wrapper seperti https://github.com/wasmerio/wasmer-python atau https://github.com/bytecodealliance/wasmtime-py, dan penasaran apakah sudah ada yang pernah menjalankan PGlite dengan cara seperti ini
Ada dua pendekatan yang sedang dikerjakan: satu adalah build WASI dari API tingkat rendah yang bisa dibungkus pengguna dengan API tingkat tinggi, dan satu lagi adalah libpglite yang bisa ditautkan dari bahasa native
Sebagian besar bahasa sudah memiliki implementasi wire protocol Postgres, jadi membungkus API tingkat rendah yang membaca dan mengeluarkannya relatif mudah, dan sisi JS PGlite juga bekerja dengan cara yang sama
subprocessuntuk menjalankanexecdanquerydari@electric-sql/pglite, lalu bertukar hasil dalam JSONStrukturnya adalah membuat instance PGlite di
db.js, menerima SQL dan parameter dari argumen command line untuk diproses, lalu darimain.pymemanggilnode db.js exec ...ataunode db.js query ...Pyodide adalah port Wasm dari CPython dan bisa berinteraksi dengan objek JavaScript melalui proxy
Sebagai contoh, setelah membuat
globalThis.db = new PGlite(), kode Python melakukanawaitpadajs.db.query()untuk menjalankanSELECT 'Hello, world!' AS "greeting";, dan saat ini bekerja di Node.js 18, Deno 1, dan Bun 1Misalnya, saya penasaran apakah ini bisa digunakan dalam proyek komersial tanpa membuka source, dan apakah saat di-embed lisensinya harus diubah agar sesuai dengan pg/fb
Kalau benar-benar perlu sekarang saya akan meninjaunya sendiri, tetapi beberapa hal yang tidak saya sukai dari kesederhanaan SQLite cukup mirip dengan hal-hal yang tidak saya sukai di MySQL/MariaDB, jadi saya jadi penasaran
Saya tidak tahu bagaimana mereka memodifikasi lapisan persistensi PostgreSQL, tetapi dibandingkan menjalankan PostgreSQL di container Docker, tampaknya mungkin ada batasan
SQLite tidak memiliki batasan seperti itu
Saya sangat menyukai PGlite
Ini solusi sempurna untuk memiliki Postgres tanpa Docker, dan hanya dengan
npm installkita bisa membuat instance Postgres di komputer lokal, sehingga onboarding developer baru ke tim menjadi sangat mudahIni juga bekerja dengan baik bersama Next.js, dan saya menggunakannya dengan Next.js Boilerplate di lingkungan lokal dan pengembangan: https://github.com/ixartz/Next-js-Boilerplate
Dengan satu kali
npm install, aplikasi full-stack termasuk database—yaitu Postgres yang berjalan—sudah siap, tanpa perlu memasang tool eksternaldocker compose, tetapi ini jelas terlihat seperti alternatif yang kerenAgar orang berikutnya tidak perlu mencari sendiri atau bertanya: persistensi di sisi browser mendukung IndexedDB dan OPFS: <https://pglite.dev/docs/filesystems>
Begitu melihat judulnya, saya langsung berpikir “ini pasti sangat cocok dengan ElectricSQL”, dan senang melihat ternyata ini memang berasal dari pihak ElectricSQL
Pengalaman developer yang langsung terasa sangat bagus, dan saya ingin mencoba PGlite serta ElectricSQL dalam proyek produksi
Sepertinya ini akan mengurangi banyak ketidaknyamanan yang saya alami sekarang, dan secara pribadi saya juga suka bekerja dengan CRDT
Selamat untuk Show HN
Saya mengikuti server Discord ElectricSQL, dan terutama tertarik untuk memakainya dari bahasa selain TypeScript, jadi senang mendengar independensi bahasa dijadikan prioritas
Saya melihat ElectricSQL sedang ditulis ulang karena perubahan arsitektur, jadi penasaran apakah itu memengaruhi PGlite, atau sekarang menjadi proyek terpisah
Selain itu, SQLite sebenarnya adalah SQL-ite, yaitu termasuk keluarga
-iteseperti urbanite, tetapi karena reanalisis dan libfixing, tampaknya sekarang orang-orang memakainya seperti sufiks-liteMungkin karena makna
litelebih jelas, sedangkanitetidak, mirip seperti helicopter yang awalnya helic + opter tetapi orang-orang memahaminya sebagai heli + copter, sehingga muncul kata seperti helipad atau quadcopter[0] https://en.wikipedia.org/wiki/Rebracketing
[1] https://en.wikipedia.org/wiki/Libfix
Perubahan di sisi Electric mengarah dari stack yang sebelumnya sangat terintegrasi ke stack yang lebih longgar keterkaitannya
PGlite adalah salah satu penyimpanan klien yang memungkinkan untuk Electric sync, dan memenuhi use case yang menempatkan database SQL lengkap di klien serta memungkinkan skema yang sama dipakai di klien dan server
Namanya tentu saja penghormatan untuk SQLite, dan huruf kecil
ldimasukkan sebagai sedikit pembeda sekaligus isyarat ke “light”, serta mengandung makna Postgres yang ringanBiasanya saya akan bilang perbedaan utama PostgreSQL dan SQLite adalah SQLite bersifat in-process, tetapi jika sekarang keduanya bisa in-process, saya penasaran apakah ada materi yang membandingkan keduanya lebih rinci
Dalam situasi apa sebaiknya memilih yang satu dibanding yang lain?
memory access out of boundsSekalipun kakaknya, PostgreSQL, adalah salah satu database paling tangguh, mungkin ini belum bisa dianggap siap produksi
Tentu saja saya juga pernah melihat dan mengalami masalah di SQLite, jadi tidak ada software yang bebas bug
Di side project terbaru, saya mencoba pglite untuk pengujian integrasi API, dan hasilnya cukup baik
Pengalaman developernya jauh lebih baik dibanding memakai sesuatu seperti testcontainers[0] untuk menjalankan postgres di Docker
[0]: https://testcontainers.com
Proyek seperti Drizzle ORM sudah memanfaatkannya dengan baik
Tim Supabase membuat pg-gateway(https://github.com/supabase-community/pg-gateway), yang memungkinkan klien Postgres apa pun terhubung ke PGlite, sehingga bisa menjadi cara untuk dipakai di CI
Yang ingin saya eksplorasi adalah VFS tingkat halaman dengan copy-on-write untuk PGlite
Jika bisa memulai PGlite dengan dataset yang sudah dimasukkan lalu langsung mem-fork database untuk tiap test, tampaknya fork per test dalam waktu di bawah milidetik bisa dilakukan tanpa kerumitan devcontainers atau database template Postgres
Saat ini di layanan produksi kami memakai postgres, tetapi untuk integration test berbasis SQLite kami men-dump skema yang kompatibel dengan SQLite
Berkat itu, kami bisa menjalankan integration test di bawah 1 detik tanpa dependensi, sambil tetap memakai database nyata
Jika bisa memakai Postgres apa adanya, itu akan lebih baik karena fitur yang membutuhkan fitur khusus PG seperti full-text search juga bisa diuji
PGlite / ElectricSQL adalah teknologi yang benar-benar ingin saya coba di tempat kerja pada masa depan
Kemampuan untuk mereplikasi dan berlangganan perubahan di dalam browser terlihat sangat kuat
Dulu saya membuat software medis yang menangani workload lebih dari 2 juta pasien serta refill obat kemoterapi/HIV/imunologi, dan kasus orang saling menimpa pekerjaan satu sama lain saat memproses asuransi atau menelepon pasien itu umum terjadi
Karena IE7, kami harus membuat sistem locking sendiri yang bergantung pada fungsi interval dan websocket, dan saat seseorang menelepon pasien, petugas bantuan finansial tidak bisa bekerja pada profil yang sama
Full-text search atau vector search yang sangat mahal biayanya dalam skala besar juga tampaknya bisa dimanfaatkan secara lokal
Untuk software medis, itu pilihan yang sangat buruk
Saya penasaran apakah ada versi native yang mirip dengan ini
Kalau nanti ingin membuat aplikasi native, saya berharap tidak perlu membuang seluruh arsitektur dan mulai lagi dari awal
Di situs web dan dokumentasi, yang terlihat hanya versi WASM
Kami ingin mengekstrak perubahan inti yang harus diterapkan pada Postgres dan membuat library C
libpgliteyang bisa ditautkan dari bahasa/platform apa punReact Native tidak memiliki dukungan WASM, jadi dukungan ini penting
Keren sekali ada live query API yang reaktif
Sebagian besar contoh query reaktif sangat dasar, seperti satu tabel saja, jadi saya penasaran apakah live query juga mendukung join atau agregasi
Query disimpan sebagai view, lalu bagian dalamnya diperiksa untuk melihat bergantung pada tabel mana saja
Setelah itu
pg_notifydigunakan untuk memantau perubahanUntuk membuatnya lebih efisien, ada rencana mengintegrasikan pg_ivm(https://github.com/sraoss/pg_ivm)