انتقل إلى المحتوى الرئيسي

بناء واجهات برمجة التطبيقات باستخدام Drizzle ORM وNestJS: الدليل الكامل

أنشئ واجهات برمجة تطبيقات آمنة من النوع باستخدام Drizzle ORM وNestJS. تعرف على تعريف المخطط والترحيلات وبناء الاستعلامات والعلاقات والمعاملات وأنماط الاختبار لتطبيقات الإنتاج.

E
ECOSIRE Research and Development Team
|5 مارس 20265 دقائق قراءة966 كلمات|

لقد برز 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: "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));

المعاملات

تضمن معاملات الرذاذ العمليات الذرية. استدعاء 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 الحرفي الذي يقوم تلقائيًا بتحديد القيم المحرفة.


أفضل ممارسات الأداء

  1. حدد الأعمدة المطلوبة فقط: استخدم .select(\\\\\\\\{ id: users.id, name: users.name \\\\\\\\}) بدلاً من تحديد جميع الأعمدة
  2. استخدام الفهارس: تأكد من أن الأعمدة التي تتم تصفيتها بشكل متكرر تحتوي على فهارس قاعدة البيانات
  3. النتائج المحدودة: استخدم دائمًا .limit() في استعلامات القائمة
  4. الإدراجات المجمعة: استخدم ‎.values([...array]) للإدراجات المجمعة بدلاً من الحلقات
  5. تجميع الاتصالات: قم بتكوين أحجام التجمع المناسبة لأعباء العمل لديك
  6. الاتصالات البطيئة: استخدم نمط الوكيل لتأجيل الاتصال حتى الاستعلام الأول

الأسئلة المتداولة

س: كيف يمكن مقارنة 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 - مساعدة الشركات على التوسع باستخدام حلول برمجيات المؤسسات.

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

حلول المؤسسات عبر تخطيط موارد المؤسسات (ERP) والتجارة الإلكترونية والذكاء الاصطناعي والتحليلات والأتمتة.