Postgres.js - Klien PostgreSQL untuk Node.js dan Deno
(github.com/porsager)- Klien PostgreSQL untuk Node.js dan Deno, dengan ES6 tagged template strings sebagai API inti dan dipasang melalui paket npm
postgres - Parameter kueri diproses sebelum interpolasi lalu diganti dengan placeholder protokol PostgreSQL
$1, $2, ..., dan nilainya dikirim terpisah ke database sehingga proses escaping dan casting ditangani oleh database - Pemanggilan
sql``...``mendukung pembuatan kueri yang aman dan penyusunan kueri dinamis, termasuk kueri parsial, filter dinamis, pengurutan dinamis, serta penyusunan identifier nama tabel dan nama kolom tanpa risiko SQL injection akibat penggabungan string biasa - Koneksi dapat dikonfigurasi melalui URL
postgres://, objek opsi, atau variabel lingkungan yang digunakan olehpsql, dan nilai pada objek opsi akan menimpa nilai dari URL - Kueri dijalankan saat di-
await, dan hasilnya dikembalikan sebagai arrayResultyang memetakan nama kolom ke tiap objek baris; untuk menjalankan segera, bisa memakai.execute() - Alur penggunaan utama mencakup insert/update dinamis, insert banyak baris, daftar nilai
where in, transaksisql.begin, savepoint, prepared transaction, kueri berbasis file, cursor, serta metode kueri lanjutan seperti.forEach,.describe,.values, dan.raw - Integrasi dengan fitur PostgreSQL mencakup
LISTEN/NOTIFY, langganan real-time berbasis protokol logical replication, eksposur stream Node.js untukCOPY ..., serta dukungan pembatalan kueri yang sedang berjalan- Langganan real-time memerlukan pembuatan publication di database,
wal_level = logicaldipostgresql.conf, serta koneksi dengan pengguna replication atau superuser - API stream
COPY ...tidak menyediakan type safety, sehingga parameter kueri copy harus disesuaikan dengan kode baca/tulis stream Node.js dan penanganan backpressure
- Langganan real-time memerlukan pembuatan publication di database,
- Opsi transformasi data mendukung konversi antara camelCase, PascalCase, Kebab-Case, dan snake_case, konversi nilai
undefined, serta fungsi transformasi column/value/row yang ditentukan pengguna - Connection pool dibuat secara lazy saat kueri dibuat, dengan jumlah koneksi maksimum default
max: 10; selama transaksi, koneksi akan dipesan dari pool lalu dikembalikan setelah selesai - Mendukung API TCP socket Cloudflare Workers, dan agar berjalan di lingkungan Workers diperlukan pengaturan
compatibility_flags = ["nodejs_compat"]diwrangler.toml - Dukungan TypeScript ditujukan untuk menyediakan tipe bagi API publik, tetapi ada keterbatasan bahwa tipe tidak selalu diperbarui bersamaan saat fitur ditambahkan atau diubah
1 komentar
Pendapat di Hacker News
Kalau ingin memanfaatkan fitur-fitur bagus Postgres dan menulis SQL langsung, bekerja dengan library ini benar-benar menyenangkan
Tidak ada abstraksi mewah yang sok modern seperti Prisma, tidak ada anotasi tipe rumit seperti library TypeScript lain, cukup menulis pernyataan SQL biasa dengan gaya JavaScript
Beberapa tahun lalu saya muak memaksakan diri memakai Prisma, lalu mulai benar-benar mempelajari Postgres dan mencoba berbagai alternatif; setelah memakai ini beberapa menit, saya merasa tidak akan kembali lagi
Library ini benar-benar cepat. Jangan sampai melewatkan poin utamanya hanya karena membandingkannya dengan library lain yang punya sintaks template string serupa
Ini tidak bergantung pada
pg, melainkan mengimplementasikan klien level rendah sendiriSaya pernah membangun sistem yang memuat batch 10 ribu record berkali-kali dengan ini, dan performanya luar biasa
Bergantung pada use case, ini saja bisa mengubah permainan, dan terasa lebih mengesankan jika Anda terbiasa dengan standar yang Anda kira mungkin di lingkungan seperti Ruby
Selain itu, ini juga mendukung logical decoding, sehingga membuka berbagai kemungkinan untuk pemrosesan event transisi. Proyek yang sangat mengesankan dan sayang untuk dilewatkan
Tulisan terkait:
Show HN: Postgres.js – Fastest Full-Featured PostgreSQL Client for Node and Deno - https://news.ycombinator.com/item?id=30794332 - Maret 2022, 83 komentar
Show HN: Postgres.js – Fast PostgreSQL Client for Node.js - https://news.ycombinator.com/item?id=21864245 - Desember 2019, 12 komentar
Mungkin fiturnya tidak sebanyak library di tulisan asli, tetapi https://pgtyped.dev/ juga berguna
Jika menulis query sebagai file SQL, pgtyped akan membuat fungsi bertipe yang bisa dipanggil dengan parameter query
Saya penulisnya. Saya ingin menambahkan bahwa sekarang Cloudflare juga didukung
Saya suka karena dependensinya 0
Saya penasaran apa sebenarnya maksud kalimat “prepared statement otomatis dibuat untuk semua query yang dapat diinferensikan sebagai query statis”
Apakah ini berarti sebuah prepared statement sungguhan dibuat di sesi DB meskipun tidak ada variabel binding dan query itu hanya dijalankan sekali?
Kalau begitu, ini menarik, tetapi terlihat seperti pendekatan dengan pendirian yang cukup kuat
Namun biasanya yang dipakai adalah prepared statement atau portal tanpa nama, dan PostgreSQL akan membersihkannya, sehingga secara efektif hanya ada satu per sesi, yaitu per koneksi
Saya tidak paham kalimat itu, jadi saya melihat kodenya; yang dimaksud di sini ternyata adalah penggunaan prepared statement bernama secara otomatis untuk men-cache prepared statement di PostgreSQL dan di internal driver. Karena mereka membuat signature pernyataan, ini jelas desain yang opinionated
Secara pribadi, saya menganggap kode di lokasi utama pembuatan data parse/describe/bind/execute/sync cukup kurang bagus: https://github.com/porsager/postgres/blob/bf082a5c0ffe214924...
Ini dijelaskan di https://www.postgresql.org/docs/current/sql-prepare.html, dan untuk jenis rencananya lihat bagian “Notes”
Sepertinya Zapatos juga perlu disebut di sini. Ini klien Postgres JavaScript lain dengan desain yang sangat mirip, yaitu menulis SQL di dalam template string, tetapi menyediakan type safety penuh
Jika Anda menyukai TypeScript, mungkin Anda akan menyukainya: https://jawj.github.io/zapatos/
Secara pribadi, saya merasa ini salah satu library TypeScript dengan desain dan dokumentasi terbaik, dan sayang belum banyak dikenal
Sebagai alternatif saya memilih PgTyped, dan setelah 2 tahun berlalu, saya merasa keputusan beralih itu benar-benar tepat
pg, bukan PostgresJsSaya jadi penasaran sudah berapa lama proyek ini ada, lalu mengeceknya:
v1.0.1 - Januari 2020
v2.0.0 - Juni 2020, tetapi tidak pernah keluar dari beta
v3.0.0 - Maret 2022, dan sejak saat itu proyek ini tampaknya benar-benar mulai berjalan
Kelihatannya cukup menarik, jadi saya juga penasaran seberapa solid proyek ini
Postgres.js adalah salah satu library terbaik yang pernah saya gunakan sejauh ini
Cara memanfaatkan template JavaScript benar-benar intuitif