ड्रिज़ल ओआरएम सबसे तेजी से बढ़ने वाले टाइपस्क्रिप्ट ओआरएम के रूप में उभरा है, जो पूर्ण प्रकार की सुरक्षा और शून्य रनटाइम ओवरहेड के साथ एसक्यूएल-जैसे सिंटैक्स की पेशकश करता है। नेस्टजेएस के साथ मिलकर, यह उत्पादन एपीआई के निर्माण के लिए एक शक्तिशाली स्टैक बनाता है जो डेवलपर-अनुकूल और प्रदर्शन करने वाला दोनों है।
ड्रिज़ल ओआरएम सबसे तेजी से बढ़ने वाले टाइपस्क्रिप्ट ओआरएम के रूप में उभरा है, जो पूर्ण प्रकार की सुरक्षा और शून्य रनटाइम ओवरहेड के साथ एसक्यूएल-जैसे सिंटैक्स की पेशकश करता है। नेस्टजेएस के साथ मिलकर, यह उत्पादन एपीआई के निर्माण के लिए एक शक्तिशाली स्टैक बनाता है जो डेवलपर-अनुकूल और प्रदर्शन करने वाला दोनों है।
मुख्य बातें
- ड्रिज़ल पूर्ण टाइपस्क्रिप्ट अनुमान के साथ 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: "[email protected]", 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() का उपयोग न करें। इसके बजाय, एसक्यूएल टेम्पलेट शाब्दिक का उपयोग करें जो स्वचालित रूप से इंटरपोलेटेड मानों को पैरामीटराइज़ करता है।
निष्पादन सर्वोत्तम अभ्यास
- केवल आवश्यक कॉलम चुनें: सभी कॉलम चुनने के बजाय .select(\\\\\\\\{ id: user.id, name: user.name \\\\\\\\}) का उपयोग करें
- इंडेक्स का उपयोग करें: सुनिश्चित करें कि बार-बार फ़िल्टर किए गए कॉलम में डेटाबेस इंडेक्स हों
- परिणाम सीमित करें: सूची प्रश्नों पर हमेशा .limit() का उपयोग करें
- बैच इंसर्ट: लूप के बजाय बल्क इंसर्ट के लिए .values([...array]) का उपयोग करें
- Connection pooling: Configure appropriate pool sizes for your workload
- आलसी कनेक्शन: पहली क्वेरी तक कनेक्शन को स्थगित करने के लिए प्रॉक्सी पैटर्न का उपयोग करें
अक्सर पूछे जाने वाले प्रश्न
प्रश्न: नेस्टजेएस के लिए ड्रिज़ल की तुलना प्रिज्मा से कैसे की जाती है?
ड्रिज़ल अधिक SQL-उन्मुख है और इसमें शून्य रनटाइम ओवरहेड (कोई क्वेरी इंजन नहीं) है। प्रिज्मा अपनी स्वयं की क्वेरी भाषा का उपयोग करता है और इसके लिए एक जेनरेटेड क्लाइंट की आवश्यकता होती है। ड्रिज़ल का बंडल आकार छोटा होता है और ठंड की शुरुआत तेज होती है, जबकि प्रिज्मा का पारिस्थितिकी तंत्र बड़ा होता है और टूलींग भी अधिक होती है।
प्रश्न: क्या ड्रिज़ल जटिल कच्चे एसक्यूएल को संभाल सकता है?
हाँ। एसक्यूएल टेम्प्लेट शाब्दिक रूप से पैरामीटरयुक्त सुरक्षा बनाए रखते हुए कच्चे प्रश्नों का समर्थन करता है। एसक्यूएल इंजेक्शन को रोकने के लिए ड्रिज़ल कभी भी प्रश्नों के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग नहीं करता है।
प्रश्न: उत्पादन में कनेक्शन पूलिंग के बारे में क्या?
एप्लिकेशन के लिए बाहरी PgBouncer का उपयोग करें या अधिकतम कनेक्शन सीमा के साथ postgres.js ड्राइवर को कॉन्फ़िगर करें। सर्वर रहित वातावरण के लिए, अंतर्निहित पूलिंग के साथ सर्वर रहित-अनुकूलित ड्राइवरों का उपयोग करें।
प्रश्न: हम बिना डाउनटाइम के स्कीमा परिवर्तनों को कैसे संभाल सकते हैं?
माइग्रेशन फ़ाइलें जेनरेट करें, SQL की समीक्षा करें, स्टेजिंग में परीक्षण करें, फिर उत्पादन में लागू करें। PostgreSQL में अधिकांश ALTER TABLE स्टेटमेंट बिना किसी विशेष लॉक के निष्पादित होते हैं। उन कार्यों से बचें जिनमें पीक आवर्स के दौरान तालिका को फिर से लिखने की आवश्यकता होती है।
अगला क्या है
NestJS के साथ ड्रिज़ल ORM उत्पादन एपीआई के निर्माण के लिए एक प्रकार-सुरक्षित, निष्पादन योग्य आधार प्रदान करता है। SQL-जैसी API अमूर्त अंतर को कम करती है जबकि टाइपस्क्रिप्ट अनुमान रनटाइम प्रकार की त्रुटियों को समाप्त करता है।
एपीआई विकास सहायता के लिए ECOSIRE से संपर्क करें, या अपने ईआरपी के साथ कस्टम एपीआई को जोड़ने के लिए हमारी Odoo एकीकरण सेवाओं का पता लगाएं।
ECOSIRE द्वारा प्रकाशित - एंटरप्राइज़ सॉफ़्टवेयर समाधानों के साथ व्यवसायों को बड़े पैमाने पर मदद करना।
लेखक
ECOSIRE TeamTechnical 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 के साथ अपना व्यवसाय बढ़ाएं
ईआरपी, ईकॉमर्स, एआई, एनालिटिक्स और ऑटोमेशन में एंटरप्राइज समाधान।
संबंधित लेख
Odoo Hosting Requirements in 2026: Server Sizing by User Count (With Real Configs)
Odoo hosting requirements by user count: vCPU, RAM, storage, and worker settings for 5 to 250+ users, plus PostgreSQL tuning values from real deployments.
Drizzle ORM + Postgres Row-Level Security for Multi-Tenancy 2026
Implement multi-tenant SaaS with Drizzle ORM and Postgres Row-Level Security: schema, policies, session variables, NestJS integration, real production patterns.
Drizzle ORM vs Prisma 2026: Schema, Performance, DX Comparison
Balanced Drizzle vs Prisma comparison for TypeScript: schema design, performance, migrations, query DX, edge runtimes. Real production benchmarks.