Postgres.js - Node.js ve Deno için PostgreSQL istemcisi
(github.com/porsager)- Node.js ve Deno'da kullanılan bir PostgreSQL istemcisidir; temel API olarak ES6 tagged template strings kullanır ve npm paketi
postgresile kurulur - Sorgu parametreleri, enterpolasyondan önce işlenerek PostgreSQL protokol yer tutucuları
$1, $2, ...ile değiştirilir; değerler ise veritabanına ayrı olarak iletilir, böylece escape ve cast işlemlerini veritabanı gerçekleştirir sql``...``çağrısı güvenli sorgu oluşturmayı ve dinamik sorgu kurmayı destekler; normal string birleştirmesinin yol açtığı SQL injection riski olmadan kısmi sorgular, dinamik filtreler, dinamik sıralama ve tablo adı·sütun adı tanımlayıcılarının oluşturulmasını işler- Bağlantı
postgres://URL'si, seçenek nesnesi veyapsql'de kullanılan ortam değişkenleri tabanlı olarak yapılandırılabilir; seçenek nesnesindeki değerler URL'dekilerin üzerine yazılır - Sorgular
awaitedildiğinde çalıştırılır ve sonuçlar, sütun adlarını her satır nesnesine eşleyen birResultdizisi olarak döndürülür;.execute()kullanılırsa hemen çalıştırılabilir - Başlıca kullanım akışı; dinamik insert/update, çoklu satır insert,
where indeğer listesi, transactionsql.begin, savepoint, prepared transaction, dosya tabanlı sorgular, cursor,.forEach,.describe,.values,.rawgibi gelişmiş sorgu metotlarından oluşur - PostgreSQL özellikleriyle entegrasyon kapsamında
LISTEN/NOTIFY, mantıksal replikasyon protokolü tabanlı gerçek zamanlı abonelik,COPY ...için Node.js stream erişimi ve devam eden sorguları iptal etme desteği sunar- Gerçek zamanlı abonelik için veritabanında publication oluşturulması,
postgresql.confiçindewal_level = logicalayarı ve replication kullanıcısı veya superuser bağlantısı gerekir COPY ...stream API'si tip güvenliği sağlamaz; copy sorgu parametreleri ile Node.js stream okuma·yazma kodu ve backpressure yönetiminin uyumlu olması gerekir
- Gerçek zamanlı abonelik için veritabanında publication oluşturulması,
- Veri dönüştürme seçenekleri olarak camelCase, PascalCase, Kebab-Case ile snake_case arasında dönüşüm,
undefineddeğer dönüşümü ve kullanıcı tanımlı column/value/row dönüştürme fonksiyonlarını destekler - Bağlantı havuzu, sorgu oluşturulduğunda tembel şekilde başlatılır; varsayılan azami bağlantı sayısı
max: 10değeridir ve transaction sırasında bağlantı havuzdan ayrılarak işlem bitince geri verilir - Cloudflare Workers'ın TCP socket API'sini destekler; Workers ortamında çalışması için
wrangler.tomliçindecompatibility_flags = ["nodejs_compat"]ayarı gerekir - TypeScript desteği, herkese açık API tiplerini sağlamayı hedefler; ancak özellik eklendiğinde veya değiştiğinde tiplerin her zaman eşzamanlı güncellenmemesi gibi bir kısıt vardır
1 yorum
Hacker News yorumları
Postgres’in iyi özelliklerinden yararlanıp doğrudan SQL yazmak istiyorsanız, bu kütüphaneyle çalışmak gerçekten keyifli
Prisma gibi gösterişli ve modernmiş gibi yapan soyutlamalar yok, diğer TypeScript kütüphanelerindeki gibi karmaşık tip anotasyonları yok; JavaScript’e yakışır şekilde dümdüz SQL cümleleri yazıyorsunuz
Birkaç yıl önce Prisma’yı zorla uydurmaya çalışmaktan bıkıp Postgres’i doğru düzgün öğrenmeye başladım ve çeşitli alternatifleri denedim; bunu birkaç dakika kullandıktan sonra geri dönmeyeceğimi hissettim
Bu kütüphane gerçekten hızlı. Benzer string template söz dizimine bakıp başka kütüphanelerle karşılaştırırken asıl noktayı kaçırmamak gerek
pg’ye bağımlı değil; kendi düşük seviyeli istemcisini uygulamışBununla tek seferde 10 binlik kayıt gruplarını defalarca yükleyen bir sistem kurdum ve performansı eziciydi
Kullanım senaryosuna göre tek başına bu bile oyunun kurallarını değiştirebilir; Ruby gibi ortamlarda mümkün olduğunu düşündüğünüz ölçütlere alışkınsanız daha da etkileyici
Ayrıca logical decoding desteği de var; geçiş/aktarım olaylarını işlemek için pek çok olasılık açıyor. Gerçekten etkileyici bir proje, gözden kaçırmak yazık olur
İlgili yazılar:
Show HN: Postgres.js – Fastest Full-Featured PostgreSQL Client for Node and Deno - https://news.ycombinator.com/item?id=30794332 - Mart 2022, 83 yorum
Show HN: Postgres.js – Fast PostgreSQL Client for Node.js - https://news.ycombinator.com/item?id=21864245 - Aralık 2019, 12 yorum
Asıl yazıdaki kütüphane kadar çok özellikli olmayabilir ama https://pgtyped.dev/ de faydalıydı
Sorguları SQL dosyası olarak yazdığınızda pgtyped, sorgu parametreleriyle çağrılabilen tipli fonksiyonlar üretiyor
Yazarıyım. Artık Cloudflare’ı da desteklediğini eklemek isterim
0 bağımlılık olmasını seviyorum
“Statik sorgu olduğu çıkarımı yapılabilen tüm sorgular için prepared statement otomatik oluşturulur” cümlesinin pratikte ne anlama geldiğini merak ediyorum
Bind değişkeni yoksa ve sorgu yalnızca bir kez çalıştırılsa bile DB oturumunda gerçekten bir prepared statement mı oluşturuluyor?
Öyleyse ilginç ama epey iddialı bir yaklaşım gibi görünüyor
Ancak genelde isimsiz prepared statement veya portal kullanılır ve PostgreSQL bunları temizlediği için pratikte oturum, yani bağlantı başına yalnızca bir tane tutulur
O cümleyi anlamadığım için koda baktım; burada kastedilen, isimli prepared statement’ları otomatik kullanarak prepared statement’ları PostgreSQL ve sürücü içinde önbelleğe almakmış. Statement signature oluşturuyor, bu da kesinlikle görüşlü bir tasarım
parse/describe/bind/execute/sync verisinin çoğunlukla oluşturulduğu yerdeki kodu şahsen pek beğenmiyorum: https://github.com/porsager/postgres/blob/bf082a5c0ffe214924...
https://www.postgresql.org/docs/current/sql-prepare.html adresinde açıklanıyor; plan türü için “Notes” bölümüne bakabilirsiniz
Burada Zapatos’tan da bahsetmek gerekir gibi. Template string içinde SQL yazan, çok benzer tasarıma sahip başka bir Postgres JavaScript istemcisi; tam tip güvenliği sağlıyor
TypeScript seviyorsanız hoşunuza gidebilir: https://jawj.github.io/zapatos/
Şahsen tasarımı ve dokümantasyonu en iyi TypeScript kütüphanelerinden biri olduğunu düşünüyorum; çok bilinmemesi üzücü
Alternatif olarak PgTyped’i seçtim; aradan 2 yıl geçti ve geçiş yaptığıma gerçekten çok memnunum
pg’ye neden bağımlı olduğunu bilen var mı merak ediyorumBu projenin ne kadar eski olduğunu merak edip baktım:
v1.0.1 - Ocak 2020
v2.0.0 - Haziran 2020, ama betadan çıkamamış
v3.0.0 - Mart 2022, proje sanki bu noktadan itibaren asıl anlamda başlamış gibi görünüyor
Oldukça ilginç görünüyor; ne kadar sağlam olduğunu da merak ediyorum
Postgres.js şimdiye kadar kullandığım kütüphaneler arasında en üst seviyede
JavaScript’in template kullanım şekli gerçekten çok sezgisel