كيفية بناء قاعدة بيانات في Node.js باستخدام Prisma وSQLite

دقائق القراءة: 6

مقدمة: لماذا يُعد Prisma خياراً حديثاً لإدارة قواعد البيانات؟

خلال السنوات الأخيرة، برز Prisma كأحد أشهر أدوات ORM الحديثة في بيئة Node.js، خاصة عند العمل مع TypeScript. وتكمن قوته في تبسيط التعامل مع قاعدة البيانات، وتسريع بناء النماذج، وتوليد الأنواع البرمجية تلقائياً، مما يقلل نسبة الأخطاء ويرفع جودة الشفرة.

إذا كنت تبحث عن طريقة عملية لبناء قاعدة بيانات خفيفة وسهلة التجهيز دون تعقيد إعدادات الخادم، فإن الجمع بين Prisma وSQLite يُعد نقطة انطلاق ممتازة. في هذا الدليل، سننشئ مشروعاً بسيطاً يحاكي قاعدة بيانات مصغّرة لتطبيق شبيه بـTwitter، مع شرح الخطوات من التهيئة وحتى تنفيذ أول استعلام.

شرح بناء قاعدة بيانات Node.js باستخدام Prisma وSQLite بخطوات عملية للمطورين

ما هو Prisma؟

Prisma هو إطار عمل حديث لإدارة قواعد البيانات بأسلوب ORM، أي أنه يربط بين الكيانات البرمجية والجداول داخل قاعدة البيانات بطريقة منظمة وواضحة. بدلاً من كتابة كثير من استعلامات SQL يدوياً، يمكنك تعريف النماذج ثم استخدام واجهات جاهزة للتعامل مع البيانات.

ومن أبرز مزاياه:

  • تكامل ممتاز مع Node.js وTypeScript.
  • إنشاء أنواع الكيانات تلقائياً.
  • صياغة واضحة لملف المخطط schema.prisma.
  • دعم لتقنيات شائعة مثل Next.js وGraphQL وNestJS وExpress.js وApollo.
  • دعم لقواعد بيانات متعددة مثل PostgreSQL وMySQL وSQLite.

بكلمات مختصرة، إذا كنت تريد حلاً عصرياً يوازن بين سهولة التطوير والاعتمادية، فإن Prisma يستحق التجربة.

لماذا نختار SQLite في هذا الشرح؟

تم اختيار SQLite لأنه محرك قاعدة بيانات مدمج وخفيف، ولا يتطلب تثبيت خادم مستقل أو إعدادات معقدة. هذا يعني أن المشروع يعمل مباشرة بعد تنفيذ الخطوات، وهو ما يجعله مثالياً للتعلم، والتجارب السريعة، وبناء النماذج الأولية.

كما أن استخدام SQLite هنا لا يمنعك لاحقاً من الانتقال إلى قاعدة بيانات أكبر مثل PostgreSQL، لأن Prisma يسهل عملية التطوير والترحيل بين البيئات المختلفة.

المتطلبات الأساسية قبل البدء

1. تثبيت Node.js

يُفضّل استخدام إصدار 12.2 أو أحدث. ويمكنك التحقق من الإصدار الحالي عبر الطرفية باستخدام الأمر التالي:

node -v

2. معرفة أساسية بـSQL

لست بحاجة إلى أن تكون خبيراً، لكن من المفيد أن تفهم المفاهيم الأساسية مثل:

  • إنشاء الجداول.
  • العلاقات بين الكيانات.
  • تنفيذ الاستعلامات الأساسية.

إعداد مشروع Node.js بسيط

لنبدأ بإنشاء مجلد المشروع ثم الانتقال إليه:

$ mkdir minimalistic-twitter
$ cd minimalistic-twitter

بعد ذلك، ثبّت الحزم المطلوبة لتشغيل TypeScript وPrisma:

$ npm init -y
$ npm install prisma typescript ts-node @types/node --save-dev
$ npm install @prisma/client

بعد تنفيذ الأوامر السابقة، ستلاحظ ظهور المجلد node_modules والملف package.json داخل المشروع.

إعداد ملف TypeScript

أنشئ ملفاً باسم tsconfig.json في جذر المشروع، ثم أضف الإعدادات التالية:

{
  "compilerOptions": {
    "sourceMap": true,
    "outDir": "dist",
    "strict": true,
    "lib": ["esnext"],
    "esModuleInterop": true
  }
}

هذه الإعدادات تجهز المشروع لكتابة شيفرة أكثر انضباطاً، وتساعد في إنتاج مخرجات منظمة عند البناء أو التشغيل.

تهيئة Prisma وربط SQLite

يمكنك أولاً استعراض أوامر Prisma CLI باستخدام:

$ npx prisma

ثم نهيئ المشروع مع تحديد مزود قاعدة البيانات على أنه sqlite:

$ npx prisma init --datasource-provider sqlite

بعد انتهاء العملية، ستجد العناصر التالية داخل المشروع:

  • ملف .env
  • مجلد prisma
  • ملف schema.prisma داخل المجلد السابق

يحتوي الملف schema.prisma على إعدادات الاتصال بقاعدة البيانات، وسيُستخدم لاحقاً لتعريف النماذج والجداول. أما الملف .env فيتضمن متغير البيئة DATABASE_URL وغالباً ستكون قيمته ./dev.db، وهو ملف قاعدة البيانات المحلي.

هيكل مشروع Node.js بعد تهيئة Prisma وSQLite داخل المجلدات الأساسية

بناء أول نموذج: كيان المستخدم User

سننشئ قاعدة بيانات مصغرة لتطبيق شبيه بـTwitter. وسيتضمن النموذج الأول كيان المستخدم، والذي يحتوي على:

  • معرّف id
  • بريد إلكتروني فريد email
  • اسم مستخدم username
  • قائمة تغريدات tweets

أضف النموذج التالي إلى ملف schema.prisma بعد إعداد الاتصال:

// After the database connection
model User {
  id       Int     @id @default(autoincrement())
  email    String  @unique
  username String
  tweets   Tweet[]
}

في هذا النموذج:

  • الحقل id هو المفتاح الأساسي ويتم توليده تلقائياً.
  • الحقل email فريد، وبالتالي لا يمكن تسجيل مستخدمين بالبريد نفسه.
  • الحقل tweets يعبّر عن علاقة واحد إلى متعدد مع كيان Tweet.

بناء النموذج الثاني: كيان التغريدة Tweet

بعد إنشاء المستخدمين، نحتاج إلى كيان خاص بالتغريدات. يحتوي هذا النموذج على:

  • معرّف id
  • تاريخ الإنشاء createdAt
  • نص التغريدة text
  • معرّف المستخدم userId

أضف النموذج التالي بعد تعريف User في ملف schema.prisma:

// After the database connection
// After the User model
model Tweet {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  text      String
  userId    Int
  user      User     @relation(fields: [userId], references: [id])
}

هذا الربط يوضح أن كل تغريدة ترتبط بمستخدم واحد، بينما يستطيع كل مستخدم امتلاك عدد غير محدود من التغريدات.

إنشاء أول Migration لقاعدة البيانات

بعد تعريف النماذج، نحتاج إلى توليد قاعدة البيانات فعلياً. يتم ذلك باستخدام نظام الترحيلات في Prisma، والذي يساعدك على مزامنة المخطط البرمجي مع بنية قاعدة البيانات دون فقدان التنظيم.

نفّذ الأمر التالي:

npx prisma migrate dev --name initialize

يمكنك تغيير الاسم initialize إلى أي وصف مناسب للتعديلات التي تجريها. إذا نجح الأمر، فهذا يعني أن الملف schema.prisma صحيح من حيث البنية والعلاقات.

ستلاحظ بعد ذلك إنشاء ملفات جديدة، من بينها ملف migration.sql الذي يتضمن أوامر SQL المسؤولة عن إنشاء الجداول فعلياً.

هيكل المشروع بعد إنشاء أول ترحيل Migration باستخدام Prisma في SQLite

اختبار قاعدة البيانات في مشروع Node.js

الآن أصبحت قاعدة البيانات جاهزة للاستخدام. سننشئ ملفاً باسم index.ts في جذر المشروع لتجربة إضافة مستخدم وتغريدة، ثم استرجاع البيانات المرتبطة بهما.

تهيئة الاتصال بـPrisma Client

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

async function main() {}

main()
  .catch((e) => {
    throw e;
  })
  .finally(async () => {
    await prisma.$disconnect();
  });

هذا الجزء ينشئ كائناً من PrismaClient ويضمن إغلاق الاتصال بقاعدة البيانات عند انتهاء التنفيذ.

إضافة مستخدم وتغريدة ثم جلب البيانات

يمكنك الآن ملء الدالة main() بالتعليمات التالية:

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

async function main() {
  const newUser = await prisma.user.create({
    data: {
      email: "hello@herewecode.io",
      username: "gaelgthomas",
    },
  });

  console.log("New User:");
  console.log(newUser);

  const firstTweet = await prisma.tweet.create({
    data: {
      text: "Hello world!",
      userId: newUser.id,
    },
  });

  console.log("First tweet:");
  console.log(firstTweet);

  const newUserWithTweets = await prisma.user.findUnique({
    where: {
      email: "hello@herewecode.io",
    },
    include: {
      tweets: true,
    },
  });

  console.log("User object with Tweets:");
  console.dir(newUserWithTweets);
}

main()
  .catch((e) => {
    throw e;
  })
  .finally(async () => {
    await prisma.$disconnect();
  });

يوضح هذا المثال ثلاث عمليات مهمة:

  1. إنشاء مستخدم جديد عبر prisma.user.create().
  2. إنشاء تغريدة مرتبطة بالمستخدم عبر prisma.tweet.create().
  3. استرجاع المستخدم مع جميع تغريداته باستخدام findUnique() وinclude.

إعداد أمر التشغيل داخل package.json

لتشغيل الملف index.ts بسهولة، أضف سكربت مناسب داخل قسم scripts في الملف package.json:

"scripts": {
  "dev": "ts-node ./index.ts",
  "test": "echo \"Error: no test specified\" && exit 1"
}

بعد ذلك شغّل المشروع بالأمر التالي:

$ npm run dev

إذا سار كل شيء كما ينبغي، فستظهر في الطرفية بيانات المستخدم والتغريدة التي أنشأتها، مما يؤكد نجاح الاتصال والتعامل مع قاعدة البيانات.

نتيجة تشغيل مشروع Node.js مع Prisma وSQLite ونجاح إنشاء المستخدم والتغريدة

أفكار عملية لتطوير قاعدة البيانات لاحقاً

بعد الانتهاء من النموذج الأساسي، يمكنك توسيع المشروع بخصائص أكثر واقعية، مثل:

  • إضافة حقول جديدة إلى كيان User مثل تاريخ الميلاد، النبذة الشخصية، أو العنوان.
  • بناء نظام إعجابات بحيث يمكن لكل تغريدة استقبال إعجابات متعددة.
  • إضافة تعليقات أو وسوم hashtags.
  • إنشاء طبقة API عبر Express.js أو NestJS لاستهلاك البيانات.
  • الانتقال لاحقاً من SQLite إلى PostgreSQL عند الحاجة إلى بيئة إنتاج أكبر.

مقارنة سريعة بين دور Prisma وSQLite في هذا المشروع

العنصر الدور الفائدة
Prisma إدارة النماذج والترحيلات والاستعلامات تسريع التطوير وتقليل الأخطاء
SQLite محرك قاعدة بيانات محلي وخفيف سهولة التجربة دون إعداد خادم
TypeScript تعزيز سلامة الأنواع داخل المشروع تحسين جودة الشفرة وسهولة الصيانة

أفضل ممارسات سيو ومحتوى تقني عند كتابة شروحات قواعد البيانات

إذا كنت تنشر هذا النوع من المقالات على منصة تقنية، فاحرص على:

  • استخدام عناوين واضحة تتضمن كلمات مفتاحية بشكل طبيعي.
  • تقسيم الشرح إلى خطوات قصيرة وقابلة للتطبيق.
  • عرض الأكواد داخل وسوم مخصصة لسهولة القراءة.
  • شرح الهدف من كل أمر بدلاً من الاكتفاء بسرده.
  • تقديم أمثلة عملية قابلة للتطوير، لأن هذا يرفع قيمة المحتوى للمستخدم ومحركات البحث معاً.

الخلاصة التقنية

يُعد الجمع بين Prisma وSQLite خياراً ممتازاً لبدء بناء قاعدة بيانات في مشاريع Node.js، خصوصاً عند الرغبة في التعلم السريع أو تطوير نموذج أولي نظيف. ما يميز هذا النهج هو سهولة تعريف الكيانات، وضوح العلاقات، وبساطة إنشاء الترحيلات والاستعلامات. ومن الناحية التقنية، فإن هذه البنية تمنحك أساساً مرناً يمكن توسيعه لاحقاً نحو تطبيقات أكبر دون الحاجة إلى إعادة بناء المنظومة من الصفر.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *