لقد برز Drizzle ORM باعتباره برنامج TypeScript ORM الأسرع نموًا، حيث يقدم بناء جملة يشبه SQL مع أمان كامل للنوع وبدون أي عبء تشغيل. بالاشتراك مع NestJS، فإنه ينشئ حزمة قوية لبناء واجهات برمجة تطبيقات الإنتاج التي تكون صديقة للمطورين وذات أداء عالي.
**لقد برز Drizzle ORM باعتباره برنامج TypeScript ORM الأسرع نموًا، حيث يقدم بناء جملة يشبه SQL مع أمان كامل للنوع وبدون أي عبء تشغيل. ** بالاشتراك مع NestJS، فإنه ينشئ حزمة قوية لبناء واجهات برمجة تطبيقات الإنتاج التي تكون صديقة للمطورين وذات أداء عالي.
الوجبات الرئيسية
- يوفر Drizzle استعلامات تشبه SQL مع استدلال TypeScript الكامل - دون الحاجة إلى خطوة إنشاء التعليمات البرمجية
- يتكامل حقن التبعية NestJS بشكل نظيف مع اتصالات قاعدة بيانات Drizzle
- يضمن التطوير المعتمد على المخطط بقاء قاعدة البيانات وأنواع TypeScript متزامنة
- تتعامل أوامر الدفع والترحيل Drizzle مع تطور المخطط دون توقف
إعداد المشروع
التثبيت
ابدأ بمشروع NestJS وأضف تبعيات Drizzle:
npm install drizzle-orm postgres
npm install -D drizzle-kit @types/pg
نوصي باستخدام برنامج التشغيل postgres.js لأدائه. لتجميع الاتصالات في الإنتاج، فكر في PgBouncer أو برامج التشغيل المحسنة بدون خادم.
وحدة الاتصال بقاعدة البيانات
قم بإنشاء وحدة قاعدة بيانات عالمية توفر مثيل Drizzle عبر حقن التبعية. حدد موفر DB_TOKEN باستخدام useFactory الذي ينشئ عميل postgres من DATABASE_URL ويعيد drizzle(client, \\\\\\\\{ schema \\\\\\\\}). قم بتصدير الرمز المميز حتى تتمكن أي خدمة من حقنه باستخدام @Inject("DRIZZLE_DB").
تعريف المخطط
تحديد جداول قاعدة البيانات باستخدام منشئي الجداول Drizzle. يقوم كل جدول بتصدير const تم إنشاؤه باستخدام pgTable() الذي يحتوي على تعريفات الأعمدة باستخدام uuid، وvarchar، والطابع الزمني، والمنطقي، وأنواع الأعمدة الأخرى. تدعم الأعمدة الإعدادات الافتراضية (defaultRandom، وdefaultNow)، والقيود (notNull، الفريدة)، والعلاقات.
Defining Relations
توفر علاقات الرذاذ تحميلًا آمنًا من النوع. قم بتعريف العلاقات باستخدام دالة العلاقات ()، مع تحديد واحد إلى متعدد مع العديد () ومن متعدد إلى واحد مع واحد (). تقوم الأعمدة المرجعية بتعيين المفاتيح الخارجية للمفاتيح الأساسية للجدول الأصلي.
بناء الاستعلام
حدد الاستعلامات
تتم قراءة استعلامات Drizzle مثل 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,orders.userId))
- تحميل العلاقة: db.query.users.findMany(\\\\\\\\{ with: {orders: true \\\\\\\\}, Limit: 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));
المعاملات
تضمن معاملات الرذاذ العمليات الذرية. استدعاء db.transaction() مع رد اتصال غير متزامن يتلقى كائن معاملة (tx). يتم تنفيذ جميع الاستعلامات ضمن رد الاتصال تلقائيًا - إذا فشل أي منها، فسيتم التراجع عن المعاملة بأكملها.
تتضمن حالات الاستخدام الشائعة إنشاء سجلات الأصل والسجلات الفرعية معًا، وتحديث المخزون عند معالجة الطلبات، وتحويل الأموال بين الحسابات.
##الهجرات
دفع المخطط (التطوير)
أثناء التطوير، يتغير مخطط الدفع مباشرة باستخدام دفع مجموعة الرذاذ. يؤدي هذا إلى مقارنة ملفات المخطط الخاص بك بقاعدة البيانات وتطبيق التغييرات. سريع التطوير ولكنه غير مناسب للإنتاج.
ملفات الترحيل (الإنتاج)
بالنسبة للإنتاج، أنشئ ملفات ترحيل SQL ذات إصدار باستخدام إنشاء drizzle-kit، ثم قم بتطبيقها باستخدام drizzle-kit migrate. يمكن مراجعة ملفات الترحيل واختبارها في التدريج وتطبيقها في مسارات CI/CD.
أنماط التكامل NestJS
نمط الخدمة
تقوم الخدمات بإدخال قاعدة بيانات Drizzle وإنشاء استعلامات باستخدام المرشحات الديناميكية:
@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، يجب تصفية كل استعلام حسب معرف المؤسسة. قم بإنشاء خدمة أساسية أو برنامج وسيط يضمن عزل المستأجر في جميع عمليات قاعدة البيانات. لا تثق مطلقًا في معرفات المؤسسة التي يقدمها العميل - قم بالتحقق من صحتها مقابل الجلسة التي تمت المصادقة عليها.
الاستعلامات ذات المعلمات
يستخدم Drizzle الاستعلامات ذات المعلمات بشكل افتراضي، مما يمنع حقن SQL. لا تستخدم أبدًا sql.raw() مع إدخال المستخدم. بدلاً من ذلك، استخدم قالب SQL الحرفي الذي يقوم تلقائيًا بتحديد القيم المحرفة.
أفضل ممارسات الأداء
- حدد الأعمدة المطلوبة فقط: استخدم .select(\\\\\\\\{ id: users.id, name: users.name \\\\\\\\}) بدلاً من تحديد جميع الأعمدة
- استخدام الفهارس: تأكد من أن الأعمدة التي تتم تصفيتها بشكل متكرر تحتوي على فهارس قاعدة البيانات
- النتائج المحدودة: استخدم دائمًا .limit() في استعلامات القائمة
- الإدراجات المجمعة: استخدم .values([...array]) للإدراجات المجمعة بدلاً من الحلقات
- تجميع الاتصالات: قم بتكوين أحجام التجمع المناسبة لأعباء العمل لديك
- الاتصالات البطيئة: استخدم نمط الوكيل لتأجيل الاتصال حتى الاستعلام الأول
الأسئلة المتداولة
س: كيف يمكن مقارنة Drizzle بـ Prisma بالنسبة إلى NestJS؟
يعد Drizzle أكثر توجهاً نحو SQL ولا يحتوي على أي حمل إضافي لوقت التشغيل (لا يوجد محرك استعلام). تستخدم Prisma لغة الاستعلام الخاصة بها وتتطلب إنشاء عميل. تتميز Drizzle بحجم حزمة أصغر وبدء تشغيل بارد أسرع، بينما تتمتع Prisma بنظام بيئي أكبر وأدوات أكثر.
س: هل يستطيع Drizzle التعامل مع SQL الأولية المعقدة؟
نعم. يدعم قالب SQL الحرفي الاستعلامات الأولية مع الحفاظ على أمان المعلمات. لا يستخدم Drizzle أبدًا تسلسل السلاسل للاستعلامات، مما يمنع حقن SQL.
س: ماذا عن تجميع الاتصالات في الإنتاج؟
استخدم PgBouncer خارجيًا للتطبيق أو قم بتكوين برنامج تشغيل postgres.js مع الحد الأقصى لحدود الاتصال. بالنسبة للبيئات التي لا تحتوي على خادم، استخدم برامج التشغيل المحسنة بدون خادم مع التجميع المضمن.
س: كيف نتعامل مع تغييرات المخطط دون توقف؟
قم بإنشاء ملفات الترحيل، ومراجعة SQL، واختبارها في التدريج، ثم قم بتطبيقها في الإنتاج. يتم تنفيذ معظم عبارات ALTER TABLE في PostgreSQL بدون أقفال حصرية. تجنب العمليات التي تتطلب إعادة كتابة الجدول خلال ساعات الذروة.
ما هو التالي
يوفر Drizzle ORM مع NestJS أساسًا آمنًا وفعالاً لبناء واجهات برمجة تطبيقات الإنتاج. تعمل واجهة برمجة التطبيقات المشابهة لـ SQL على تقليل فجوة التجريد بينما يزيل استدلال TypeScript أخطاء نوع وقت التشغيل.
اتصل بـ 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
حلول المؤسسات عبر تخطيط موارد المؤسسات (ERP) والتجارة الإلكترونية والذكاء الاصطناعي والتحليلات والأتمتة.
مقالات ذات صلة
متطلبات استضافة Odoo في عام 2026: تغيير حجم الخادم حسب عدد المستخدمين (مع التكوينات الحقيقية)
متطلبات استضافة Odoo حسب عدد المستخدمين: وحدة المعالجة المركزية الافتراضية (vCPU)، وذاكرة الوصول العشوائي (RAM)، والتخزين، وإعدادات العامل لما يزيد عن 5 إلى 250 مستخدمًا، بالإضافة إلى قيم ضبط PostgreSQL من عمليات النشر الحقيقية.
Drizzle ORM + Postgres Row-Level Security for Multi-Tenancy 2026
تنفيذ SaaS متعدد المستأجرين باستخدام Drizzle ORM وPostgres Row-Level Security: المخطط والسياسات ومتغيرات الجلسة وتكامل NestJS وأنماط الإنتاج الحقيقية.
Drizzle ORM vs Prisma 2026: المخطط والأداء ومقارنة DX
مقارنة Drizzle vs Prisma المتوازنة لـ TypeScript: تصميم المخطط والأداء والترحيلات والاستعلام DX وأوقات تشغيل الحافة. معايير الإنتاج الحقيقية.