4 पॉइंट द्वारा GN⁺ 2023-10-16 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Node.js और Deno में उपयोग होने वाला PostgreSQL क्लाइंट, जिसका मुख्य API ES6 tagged template strings है और जिसे npm पैकेज postgres के रूप में इंस्टॉल किया जाता है
  • क्वेरी पैरामीटर interpolation से पहले प्रोसेस किए जाते हैं और PostgreSQL प्रोटोकॉल placeholders $1, $2, ... से बदले जाते हैं, जबकि values अलग से database को भेजी जाती हैं ताकि escaping और casting का काम database संभाले
  • sql``...`` कॉल सुरक्षित क्वेरी निर्माण और dynamic query composition को सपोर्ट करता है, और सामान्य string concatenation से होने वाले SQL injection जोखिम के बिना partial queries, dynamic filters, dynamic sorting, और table name·column name identifiers का निर्माण संभालता है
  • कनेक्शन को postgres:// URL, options object, या psql में उपयोग होने वाले environment variables के आधार पर कॉन्फ़िगर किया जा सकता है, और options object के values URL के values को override करते हैं
  • क्वेरी await किए जाने पर execute होती है और परिणाम column names को हर row object से मैप करने वाले Result array के रूप में लौटते हैं, जबकि .execute() का उपयोग करने पर इसे तुरंत चलाया जा सकता है
  • मुख्य उपयोग प्रवाह में dynamic insert/update, multiple row insert, where in value list, transaction sql.begin, savepoint, prepared transaction, file-based query, cursor, और .forEach, .describe, .values, .raw जैसे advanced query methods शामिल हैं
  • PostgreSQL फीचर्स इंटीग्रेशन के रूप में LISTEN/NOTIFY, logical replication protocol आधारित real-time subscriptions, COPY ... के लिए Node.js stream exposure, और चल रही queries को cancel करने का समर्थन शामिल है
    • real-time subscriptions के लिए database publication बनाना, postgresql.conf में wal_level = logical, और replication user या superuser connection की आवश्यकता होती है
    • COPY ... stream API type safety प्रदान नहीं करता, और copy query parameters को Node.js stream read/write code तथा backpressure handling के साथ सही तरह मिलाना पड़ता है
  • data transformation options में camelCase, PascalCase, Kebab-Case और snake_case के बीच conversion, undefined value conversion, और user-defined column/value/row transform functions का समर्थन है
  • connection pool क्वेरी बनते समय lazily बनाया जाता है, डिफ़ॉल्ट अधिकतम कनेक्शन संख्या max: 10 है, और transaction के दौरान connection को pool से reserve करके समाप्ति के बाद वापस किया जाता है
  • Cloudflare Workers के TCP socket API का समर्थन है, और Workers environment में चलाने के लिए wrangler.toml में compatibility_flags = ["nodejs_compat"] सेट करना आवश्यक है
  • TypeScript support का लक्ष्य public API types प्रदान करना है, लेकिन feature addition या changes के समय types हमेशा साथ में अपडेट हों, यह सुनिश्चित नहीं है

1 टिप्पणियां

 
GN⁺ 2023-10-16
Hacker News की राय
  • अगर आप Postgres की अच्छी खूबियों का फायदा उठाते हुए सीधे SQL लिखना चाहते हैं, तो इस लाइब्रेरी के साथ काम करना वाकई मज़ेदार है
    Prisma जैसी चमकदार, आधुनिक दिखने का दिखावा करने वाली abstraction नहीं, दूसरी TypeScript लाइब्रेरीज़ जैसी जटिल type annotations नहीं; बस JavaScript के अंदाज़ में साधारण SQL statements लिखिए
    कुछ साल पहले Prisma को जबरन फिट करके इस्तेमाल करते-करते तंग आकर मैंने Postgres को ठीक से सीखना शुरू किया और कई alternatives आज़माए, लेकिन इसे कुछ मिनट इस्तेमाल करते ही लगा कि अब वापस नहीं जाऊँगा

    • काश JavaScript में भी Elixir की Ecto जैसी कोई लाइब्रेरी होती। SQL के साथ काम करने वाले tools में यह अब तक देखे गए सबसे अच्छे में से एक था—सरल, शक्तिशाली और समझने में आसान
    • SQL के ऊपर layers चढ़ाने का तरीका मुझे हमेशा से पसंद नहीं रहा। SQL तो ऐसी चीज़ है जिसे मरते दम तक हाथ से छिनने नहीं देना चाहूँगा
    • किसी जिम्मेदार developer के कंपनी छोड़ने के बाद ऐसा code संभालना वाकई मज़ेदार होगा। न types, न comments, न abstraction, न migrations—बस pure SQL बचा होगा
    • Prisma के raw query feature में आपको क्या पसंद नहीं आया, यह जानने की उत्सुकता है
  • यह लाइब्रेरी सचमुच तेज़ है। सिर्फ मिलती-जुलती string template syntax देखकर इसे दूसरी लाइब्रेरीज़ से compare करते हुए असली बात मिस नहीं करनी चाहिए
    यह pg पर निर्भर नहीं है और इसने अपना low-level client implement किया है
    मैंने इससे ऐसा system बनाया जो एक बार में 10,000 records के batch कई बार load करता था, और performance जबरदस्त थी

    • थोड़ा विस्तार से कहें तो, 10,000–20,000 के करीब records को 20ms से कम में load कर पा रहे थे, जबकि वही काम आम तौर पर करीब 150ms लेता
      use case के हिसाब से सिर्फ यह भी game-changer हो सकता है, और अगर आप Ruby जैसे environments में संभव माने जाने वाले benchmarks के आदी हैं, तो यह और भी प्रभावशाली लगता है
      साथ ही यह logical decoding भी support करता है, जिससे transition event handling के लिए कई संभावनाएँ खुलती हैं। वाकई प्रभावशाली project है, इसे नज़रअंदाज़ करना अफसोस की बात होगी
  • संबंधित लेख:
    Show HN: Postgres.js – Fastest Full-Featured PostgreSQL Client for Node and Deno - https://news.ycombinator.com/item?id=30794332 - मार्च 2022, 83 comments
    Show HN: Postgres.js – Fast PostgreSQL Client for Node.js - https://news.ycombinator.com/item?id=21864245 - दिसंबर 2019, 12 comments

  • शायद इसमें मूल पोस्ट की लाइब्रेरी जितने features न हों, लेकिन https://pgtyped.dev/ भी उपयोगी रहा
    queries को SQL file के रूप में लिखने पर pgtyped query parameters के साथ call की जा सकने वाली typed functions बना देता है

  • मैं लेखक हूँ। यह भी जोड़ना चाहता हूँ कि अब यह Cloudflare को भी support करता है

  • मुझे यह बात पसंद है कि इसकी dependencies 0 हैं

    • आजकल यह काफी दुर्लभ है, इसलिए अलग से highlight करने लायक है
  • “जिन सभी queries को static query के रूप में infer किया जा सकता है, उनके लिए prepared statements अपने आप generate हो जाते हैं” इस वाक्य का असल मतलब क्या है, यह जानना चाहता हूँ
    क्या इसका मतलब है कि binding variables न हों और query सिर्फ एक बार execute हो, फिर भी DB session में सचमुच एक prepared statement बनता है?
    अगर ऐसा है तो दिलचस्प है, लेकिन यह काफी मजबूत राय वाला approach लगता है

    • अगर parameterized query इस्तेमाल कर रहे हैं, तो PostgreSQL का extended query flow इस्तेमाल करना ही पड़ता है, और कई लोग इसे prepared statement मानेंगे। अपने आप में यह कोई बहुत opinionated choice नहीं है
      हालांकि आम तौर पर unnamed prepared statement या portal इस्तेमाल होता है, और PostgreSQL इसे clean up कर देता है, इसलिए session, यानी connection प्रति व्यवहार में सिर्फ एक ही बना रहता है
      वह वाक्य समझ नहीं आया, इसलिए मैंने code देखा; यहाँ मतलब यह था कि named prepared statements अपने आप इस्तेमाल करके PostgreSQL और driver internals में prepared statements cache किए जाते हैं। यह statement signature बना रहा है, इसलिए यह निश्चित रूप से opinionated design है
      parse/describe/bind/execute/sync data मुख्य रूप से जहाँ बनता है, उस code को व्यक्तिगत रूप से मैं काफी खराब मानता हूँ: https://github.com/porsager/postgres/blob/bf082a5c0ffe214924...
    • Postgres दो तरह के prepared statements support करता है। एक generic prepared statement, जो parameters ले सकता है, और दूसरा custom prepared statement, जो किसी खास execution के लिए prepare होता है और parameters को plan में शामिल करता है
      यह https://www.postgresql.org/docs/current/sql-prepare.html में समझाया गया है, और plan type के लिए “Notes” section देखें
  • यहाँ Zapatos का भी जिक्र होना चाहिए। यह template strings के अंदर SQL लिखने वाले बहुत similar design वाला एक और Postgres JavaScript client है, लेकिन पूरी type safety देता है
    अगर आपको TypeScript पसंद है, तो यह पसंद आ सकता है: https://jawj.github.io/zapatos/
    व्यक्तिगत रूप से मुझे यह design और documentation के लिहाज से सबसे अच्छी TypeScript libraries में से एक लगता है, और अफसोस है कि यह ज्यादा मशहूर नहीं है

    • आखिरकार मुझे Zapatos छोड़ना पड़ा। यह कई schemas को support नहीं करता था, और types हमेशा पढ़ने में अच्छे नहीं आते थे
      विकल्प के तौर पर PgTyped चुना, और 2 साल बाद अब लगता है कि switch करना वाकई सही फैसला था
    • सहमत हूँ। lateral join feature और shortcut functions के combination की वजह से असली SQL लिखते हुए भी usability छोड़े बिना backend बनाना बहुत आसान है
    • पहली नज़र में लगता है कि Zapatos Cloudflare Workers के साथ compatible नहीं है; अगर ऐसा नहीं है तो correction चाहूँगा
    • जानना चाहता हूँ कि zapatos PostgresJs के बजाय pg पर निर्भर क्यों है
  • उत्सुकता हुई कि यह project कितना पुराना है, तो देखा:
    v1.0.1 - जनवरी 2020
    v2.0.0 - जून 2020, लेकिन beta से बाहर नहीं आ पाया
    v3.0.0 - मार्च 2022, इस समय से project सच में शुरू हुआ लगता है
    काफी दिलचस्प दिखता है, इसलिए यह कितना robust है यह भी जानना चाहता हूँ

    • Deno में कुछ समय से इसे production environment में इस्तेमाल कर रहा हूँ। काफी robust है, लेकिन documentation बहुत कम है, इसलिए complex काम करते समय अक्सर खुद टटोलकर तरीका ढूँढना पड़ता है
  • Postgres.js अब तक इस्तेमाल की गई libraries में सबसे बेहतरीन में से है
    JavaScript के templates का इसका इस्तेमाल वाकई intuitive है