4 puan yazan GN⁺ 2023-10-16 | 1 yorum | WhatsApp'ta paylaş
  • Node.js ve Deno'da kullanılan bir PostgreSQL istemcisidir; temel API olarak ES6 tagged template strings kullanır ve npm paketi postgres ile 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 veya psql'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 await edildiğinde çalıştırılır ve sonuçlar, sütun adlarını her satır nesnesine eşleyen bir Result dizisi 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 in değer listesi, transaction sql.begin, savepoint, prepared transaction, dosya tabanlı sorgular, cursor, .forEach, .describe, .values, .raw gibi 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.conf içinde wal_level = logical ayarı 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
  • Veri dönüştürme seçenekleri olarak camelCase, PascalCase, Kebab-Case ile snake_case arasında dönüşüm, undefined değ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: 10 değ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.toml içinde compatibility_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

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

    • JavaScript’te de Elixir’in Ecto’su gibi bir kütüphane olsa keşke. SQL ile çalışmak için şimdiye kadar gördüğüm en iyi araçtı; basit, güçlü ve anlaşılması kolaydı
    • SQL’in üstüne katman koyma yaklaşımını eskiden beri pek sevmedim. SQL’i ölsem de elimden bırakmak istemem
    • Sorumlu geliştirici şirketten ayrıldıktan sonra böyle bir kodu devralmak gerçekten eğlenceli olurdu. Tip yok, yorum yok, soyutlama yok, migration yok; geriye sadece saf SQL kalıyor
    • Prisma’nın raw query özelliğinde neyi beğenmediğinizi merak ediyorum
  • 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

    • Biraz açarsam, yaklaşık 10 bin–20 bin kaydı 20 ms’nin altında yükleyebiliyorduk; normalde bu iş yaklaşık 150 ms sürerdi
      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

    • Bugünlerde yeterince nadir bir durum; ayrıca vurgulanmayı hak ediyor
  • “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

    • Parametreli sorgu kullanıyorsanız PostgreSQL’in extended query flow’unu kullanmak zorundasınız; birçok kişi de bunu prepared statement olarak düşünecektir. Bu başlı başına çok görüşlü bir tercih değil
      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...
    • Postgres iki tür prepared statement destekler. Parametre alabilen generic prepared statement ve belirli bir çalıştırma için hazırlanıp parametreleri plana yansıtan custom prepared statement vardır
      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ü

    • Zapatos’tan sonunda vazgeçmek zorunda kaldım. Birden fazla schema desteklemiyordu ve tipler de her zaman okunabilir çıkmıyordu
      Alternatif olarak PgTyped’i seçtim; aradan 2 yıl geçti ve geçiş yaptığıma gerçekten çok memnunum
    • Katılıyorum. lateral join özelliği ve kısa yol fonksiyonlarının birleşimi sayesinde gerçek SQL yazarken kullanılabilirlikten ödün vermeden backend geliştirmek çok kolay
    • İlk bakışta Zapatos Cloudflare Workers ile uyumlu değil gibi görünüyor; değilse düzeltilmek isterim
    • zapatos’un PostgresJs yerine pg’ye neden bağımlı olduğunu bilen var mı merak ediyorum
  • Bu 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

    • Deno’da bir süredir production ortamında kullanıyorum. Epey sağlam, ama dokümantasyonu çok eksik; karmaşık işler yaparken çoğu zaman yolu kendiniz kurcalayarak bulmanız gerekiyor
  • Postgres.js şimdiye kadar kullandığım kütüphaneler arasında en üst seviyede
    JavaScript’in template kullanım şekli gerçekten çok sezgisel