4 poin oleh GN⁺ 2023-10-16 | 1 komentar | Bagikan ke WhatsApp
  • 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 oleh psql, dan nilai pada objek opsi akan menimpa nilai dari URL
  • Kueri dijalankan saat di-await, dan hasilnya dikembalikan sebagai array Result yang 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, transaksi sql.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 untuk COPY ..., serta dukungan pembatalan kueri yang sedang berjalan
    • Langganan real-time memerlukan pembuatan publication di database, wal_level = logical di postgresql.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
  • 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"] di wrangler.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

 
GN⁺ 2023-10-16
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

    • Akan bagus kalau JavaScript punya library seperti Ecto di Elixir. Dari semua alat untuk menangani SQL yang pernah saya lihat, itu yang terbaik sejauh ini: sederhana, kuat, dan mudah dipahami
    • Saya dari dulu kurang suka pendekatan menumpuk lapisan di atas SQL. SQL adalah sesuatu yang tidak ingin saya lepaskan bahkan setelah mati
    • Pasti seru sekali kalau harus mengambil alih kode seperti ini setelah developer yang bertanggung jawab meninggalkan perusahaan. Tidak ada tipe, komentar, abstraksi, migrasi; yang tersisa hanya SQL murni
    • Saya penasaran apa yang tidak Anda sukai dari fitur raw query Prisma
  • 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 sendiri
    Saya pernah membangun sistem yang memuat batch 10 ribu record berkali-kali dengan ini, dan performanya luar biasa

    • Kalau dijelaskan lebih lanjut, kami bisa memuat sekitar 10 ribu–20 ribu record dalam waktu di bawah 20 ms; pekerjaan yang semula kira-kira akan memakan 150 ms
      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

    • Di zaman sekarang ini cukup langka, jadi layak disorot tersendiri
  • 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

    • Jika memakai query berparameter, Anda memang harus memakai extended query flow PostgreSQL, dan banyak orang akan menganggapnya sebagai prepared statement. Itu sendiri bukan pilihan yang terlalu opinionated
      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...
    • Postgres mendukung dua jenis prepared statement. Ada generic prepared statement yang dapat menerima parameter, dan custom prepared statement yang disiapkan untuk eksekusi tertentu serta memasukkan parameter ke dalam perencanaan
      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

    • Pada akhirnya saya harus menyerah memakai Zapatos. Alasannya, ia tidak mendukung beberapa schema, dan tipenya juga tidak selalu mudah dibaca
      Sebagai alternatif saya memilih PgTyped, dan setelah 2 tahun berlalu, saya merasa keputusan beralih itu benar-benar tepat
    • Setuju. Berkat fitur lateral join dan kombinasi fungsi pintasnya, sangat mudah membangun backend sambil tetap menulis SQL sungguhan tanpa mengorbankan kemudahan pakai
    • Sekilas, Zapatos tampaknya tidak kompatibel dengan Cloudflare Workers; saya senang jika dikoreksi kalau ternyata tidak demikian
    • Saya penasaran apakah ada yang tahu mengapa zapatos bergantung pada pg, bukan PostgresJs
  • Saya 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

    • Saya sudah cukup lama menggunakannya di lingkungan produksi dengan Deno. Cukup solid, tetapi dokumentasinya masih sangat kurang, jadi untuk pekerjaan yang kompleks sering kali harus meraba-raba sendiri cara melakukannya
  • Postgres.js adalah salah satu library terbaik yang pernah saya gunakan sejauh ini
    Cara memanfaatkan template JavaScript benar-benar intuitif