Skip to main content

Building APIs with Drizzle ORM and NestJS: Complete Guide

Build type-safe APIs with Drizzle ORM and NestJS. Learn schema definition, migrations, query building, relations, transactions, and testing patterns for production applications.

E
ECOSIRE Research and Development Team
|5 मार्च 20266 मिनट पढ़ें1.2k शब्द|

ड्रिज़ल ओआरएम सबसे तेजी से बढ़ने वाले टाइपस्क्रिप्ट ओआरएम के रूप में उभरा है, जो पूर्ण प्रकार की सुरक्षा और शून्य रनटाइम ओवरहेड के साथ एसक्यूएल-जैसे सिंटैक्स की पेशकश करता है। नेस्टजेएस के साथ मिलकर, यह उत्पादन एपीआई के निर्माण के लिए एक शक्तिशाली स्टैक बनाता है जो डेवलपर-अनुकूल और प्रदर्शन करने वाला दोनों है।

ड्रिज़ल ओआरएम सबसे तेजी से बढ़ने वाले टाइपस्क्रिप्ट ओआरएम के रूप में उभरा है, जो पूर्ण प्रकार की सुरक्षा और शून्य रनटाइम ओवरहेड के साथ एसक्यूएल-जैसे सिंटैक्स की पेशकश करता है। नेस्टजेएस के साथ मिलकर, यह उत्पादन एपीआई के निर्माण के लिए एक शक्तिशाली स्टैक बनाता है जो डेवलपर-अनुकूल और प्रदर्शन करने वाला दोनों है।

मुख्य बातें

  • ड्रिज़ल पूर्ण टाइपस्क्रिप्ट अनुमान के साथ SQL-जैसी क्वेरीज़ प्रदान करता है - कोई कोड जनरेशन चरण नहीं
  • NestJS निर्भरता इंजेक्शन ड्रिज़ल डेटाबेस कनेक्शन के साथ स्पष्ट रूप से एकीकृत होता है
  • स्कीमा-संचालित विकास यह सुनिश्चित करता है कि डेटाबेस और टाइपस्क्रिप्ट प्रकार सिंक्रनाइज़ रहें
  • ड्रिज़ल पुश और माइग्रेशन कमांड बिना डाउनटाइम के स्कीमा विकास को संभालते हैं

प्रोजेक्ट सेटअप

स्थापना

NestJS प्रोजेक्ट से प्रारंभ करें और ड्रिज़ल निर्भरताएँ जोड़ें:

npm install drizzle-orm postgres
npm install -D drizzle-kit @types/pg

हम इसके प्रदर्शन के लिए postgres.js ड्राइवर की अनुशंसा करते हैं। उत्पादन में कनेक्शन पूलिंग के लिए, PgBouncer या सर्वर रहित-अनुकूलित ड्राइवरों पर विचार करें।

डेटाबेस कनेक्शन मॉड्यूल

निर्भरता इंजेक्शन के माध्यम से ड्रिज़ल उदाहरण प्रदान करने वाला एक वैश्विक डेटाबेस मॉड्यूल बनाएं। यूज़फ़ैक्टरी का उपयोग करके एक DB_TOKEN प्रदाता को परिभाषित करें जो DATABASE_URL से एक पोस्टग्रेज़ क्लाइंट बनाता है और ड्रिज़ल (क्लाइंट, \\\\\\\\{ स्कीमा \\\\\\\\}) लौटाता है। टोकन निर्यात करें ताकि कोई भी सेवा इसे @Inject("DRIZZLE_DB") के साथ इंजेक्ट कर सके।


स्कीमा परिभाषा

ड्रिज़ल टेबल बिल्डर्स का उपयोग करके डेटाबेस तालिकाओं को परिभाषित करें। प्रत्येक तालिका pgTable() के साथ बनाई गई एक स्थिरांक को निर्यात करती है जिसमें uuid, varchar, टाइमस्टैम्प, बूलियन और अन्य कॉलम प्रकारों का उपयोग करके कॉलम परिभाषाएँ होती हैं। कॉलम डिफ़ॉल्ट (defaultRandom, defaultNow), बाधाओं (notNull, अद्वितीय) और संबंधों का समर्थन करते हैं।

रिश्तों को परिभाषित करना

बूंदा बांदी संबंध प्रकार-सुरक्षित उत्सुक लोडिंग प्रदान करते हैं। संबंध() फ़ंक्शन का उपयोग करके संबंधों को परिभाषित करें, एक-से-अनेक को अनेक() के साथ और अनेक-से-एक को एक() के साथ निर्दिष्ट करते हुए। संदर्भ कॉलम विदेशी कुंजियों को उनकी मूल तालिका प्राथमिक कुंजियों में मैप करते हैं।


क्वेरी बिल्डिंग

क्वेरीज़ चुनें

पूर्ण प्रकार का अनुमान प्रदान करते समय बूंदा बांदी क्वेरीज़ SQL की तरह पढ़ी जाती हैं:

  • सरल चयन: db.select().from(users)
  • फ़िल्टर: db.select().from(users).where(and(eq(users.role, "admin"), eq(users.isActive, true)))
  • जुड़ने के साथ: db.select().from(users).leftJoin(orders, eq(users.id, order.userId))
  • रिलेशन लोडिंग: db.query.users.findMany(\\\\\\\\{ साथ: { ऑर्डर: सत्य \\\\\\\\}, सीमा: 20 })

सम्मिलित करें, अद्यतन करें, हटाएँ

// Insert with returning
const [newUser] = await this.db
  .insert(users)
  .values({ email: "user@example.com", name: "New User" })
  .returning();

// Update
await this.db
  .update(users)
  .set({ role: "admin", updatedAt: new Date() })
  .where(eq(users.id, userId));

// Delete
await this.db.delete(users).where(eq(users.id, userId));

लेन-देन

बूंदा बांदी लेनदेन परमाणु संचालन सुनिश्चित करते हैं। लेनदेन ऑब्जेक्ट (tx) प्राप्त करने वाले async कॉलबैक के साथ db.transaction() को कॉल करें। कॉलबैक के भीतर सभी प्रश्न परमाणु रूप से निष्पादित होते हैं - यदि कोई विफल होता है, तो संपूर्ण लेनदेन वापस आ जाता है।

सामान्य उपयोग के मामलों में माता-पिता और बच्चे के रिकॉर्ड एक साथ बनाना, ऑर्डर संसाधित करते समय इन्वेंट्री को अपडेट करना और खातों के बीच धनराशि स्थानांतरित करना शामिल है।


प्रवास

स्कीमा पुश (विकास)

विकास के दौरान, पुश स्कीम सीधे ड्रिज़ल-किट पुश के साथ बदलती है। यह आपकी स्कीमा फ़ाइलों की तुलना डेटाबेस से करता है और परिवर्तन लागू करता है। विकास के लिए तेज़ लेकिन उत्पादन के लिए उपयुक्त नहीं।

माइग्रेशन फ़ाइलें (उत्पादन)

उत्पादन के लिए, ड्रिज़ल-किट जेनरेट के साथ संस्करणयुक्त SQL माइग्रेशन फ़ाइलें जेनरेट करें, फिर उन्हें ड्रिज़ल-किट माइग्रेट के साथ लागू करें। माइग्रेशन फ़ाइलों की समीक्षा की जा सकती है, स्टेजिंग में परीक्षण किया जा सकता है और सीआई/सीडी पाइपलाइनों में लागू किया जा सकता है।


NestJS एकीकरण पैटर्न

सेवा पैटर्न

सेवाएँ ड्रिज़ल डेटाबेस को इंजेक्ट करती हैं और गतिशील फ़िल्टर के साथ क्वेरीज़ बनाती हैं:

@Injectable()
export class ProductsService {
  constructor(@Inject("DRIZZLE_DB") private db: DrizzleDB) {}

  async findAll(filters: ProductFilters) {
    const conditions = [];
    if (filters.category)
      conditions.push(eq(products.category, filters.category));
    if (filters.minPrice)
      conditions.push(gte(products.price, filters.minPrice));

    return this.db
      .select()
      .from(products)
      .where(conditions.length ? and(...conditions) : undefined)
      .orderBy(desc(products.createdAt))
      .limit(filters.limit || 20)
      .offset(filters.offset || 0);
  }
}

बहु-किरायेदारी

SaaS अनुप्रयोगों के लिए, प्रत्येक क्वेरी को संगठन आईडी द्वारा फ़िल्टर किया जाना चाहिए। एक आधार सेवा या मिडलवेयर बनाएं जो सभी डेटाबेस संचालन पर किरायेदार अलगाव सुनिश्चित करता है। क्लाइंट द्वारा प्रदत्त संगठन आईडी पर कभी भरोसा न करें - प्रमाणित सत्र के विरुद्ध सत्यापन करें।

पैरामीटरयुक्त प्रश्न

ड्रिज़ल SQL इंजेक्शन को रोकते हुए, डिफ़ॉल्ट रूप से पैरामीटरयुक्त क्वेरीज़ का उपयोग करता है। उपयोगकर्ता इनपुट के साथ कभी भी sql.raw() का उपयोग न करें। इसके बजाय, एसक्यूएल टेम्पलेट शाब्दिक का उपयोग करें जो स्वचालित रूप से इंटरपोलेटेड मानों को पैरामीटराइज़ करता है।


निष्पादन सर्वोत्तम अभ्यास

  1. केवल आवश्यक कॉलम चुनें: सभी कॉलम चुनने के बजाय .select(\\\\\\\\{ id: user.id, name: user.name \\\\\\\\}) का उपयोग करें
  2. इंडेक्स का उपयोग करें: सुनिश्चित करें कि बार-बार फ़िल्टर किए गए कॉलम में डेटाबेस इंडेक्स हों
  3. परिणाम सीमित करें: सूची प्रश्नों पर हमेशा .limit() का उपयोग करें
  4. बैच इंसर्ट: लूप के बजाय बल्क इंसर्ट के लिए .values([...array]) का उपयोग करें
  5. Connection pooling: Configure appropriate pool sizes for your workload
  6. आलसी कनेक्शन: पहली क्वेरी तक कनेक्शन को स्थगित करने के लिए प्रॉक्सी पैटर्न का उपयोग करें

अक्सर पूछे जाने वाले प्रश्न

प्रश्न: नेस्टजेएस के लिए ड्रिज़ल की तुलना प्रिज्मा से कैसे की जाती है?

ड्रिज़ल अधिक SQL-उन्मुख है और इसमें शून्य रनटाइम ओवरहेड (कोई क्वेरी इंजन नहीं) है। प्रिज्मा अपनी स्वयं की क्वेरी भाषा का उपयोग करता है और इसके लिए एक जेनरेटेड क्लाइंट की आवश्यकता होती है। ड्रिज़ल का बंडल आकार छोटा होता है और ठंड की शुरुआत तेज होती है, जबकि प्रिज्मा का पारिस्थितिकी तंत्र बड़ा होता है और टूलींग भी अधिक होती है।

प्रश्न: क्या ड्रिज़ल जटिल कच्चे एसक्यूएल को संभाल सकता है?

हाँ। एसक्यूएल टेम्प्लेट शाब्दिक रूप से पैरामीटरयुक्त सुरक्षा बनाए रखते हुए कच्चे प्रश्नों का समर्थन करता है। एसक्यूएल इंजेक्शन को रोकने के लिए ड्रिज़ल कभी भी प्रश्नों के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग नहीं करता है।

प्रश्न: उत्पादन में कनेक्शन पूलिंग के बारे में क्या?

एप्लिकेशन के लिए बाहरी PgBouncer का उपयोग करें या अधिकतम कनेक्शन सीमा के साथ postgres.js ड्राइवर को कॉन्फ़िगर करें। सर्वर रहित वातावरण के लिए, अंतर्निहित पूलिंग के साथ सर्वर रहित-अनुकूलित ड्राइवरों का उपयोग करें।

प्रश्न: हम बिना डाउनटाइम के स्कीमा परिवर्तनों को कैसे संभाल सकते हैं?

माइग्रेशन फ़ाइलें जेनरेट करें, SQL की समीक्षा करें, स्टेजिंग में परीक्षण करें, फिर उत्पादन में लागू करें। PostgreSQL में अधिकांश ALTER TABLE स्टेटमेंट बिना किसी विशेष लॉक के निष्पादित होते हैं। उन कार्यों से बचें जिनमें पीक आवर्स के दौरान तालिका को फिर से लिखने की आवश्यकता होती है।


अगला क्या है

NestJS के साथ ड्रिज़ल ORM उत्पादन एपीआई के निर्माण के लिए एक प्रकार-सुरक्षित, निष्पादन योग्य आधार प्रदान करता है। SQL-जैसी API अमूर्त अंतर को कम करती है जबकि टाइपस्क्रिप्ट अनुमान रनटाइम प्रकार की त्रुटियों को समाप्त करता है।

एपीआई विकास सहायता के लिए ECOSIRE से संपर्क करें, या अपने ईआरपी के साथ कस्टम एपीआई को जोड़ने के लिए हमारी Odoo एकीकरण सेवाओं का पता लगाएं।


ECOSIRE द्वारा प्रकाशित - एंटरप्राइज़ सॉफ़्टवेयर समाधानों के साथ व्यवसायों को बड़े पैमाने पर मदद करना।

शेयर करें:
E

लेखक

ECOSIRE Team

Technical Writing

The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.

ECOSIRE

ECOSIRE के साथ अपना व्यवसाय बढ़ाएं

ईआरपी, ईकॉमर्स, एआई, एनालिटिक्स और ऑटोमेशन में एंटरप्राइज समाधान।