مقدمة إلى Prisma: ORM حديث لـ TypeScript
\n\nPrisma هو ORM (تعيين الكائنات العلائقية) حديث لـ TypeScript و Node.js، يغير جذريًا طريقة التعامل مع قواعد البيانات. على عكس ORMs التقليدية مثل Sequelize أو TypeORM، يقدم Prisma نموذج بيانات تصريحيًا، وتوليدًا تلقائيًا للأنواع، وواجهة برمجة تطبيقات بديهية. تدعم المكتبة PostgreSQL، MySQL، SQLite، SQL Server، MongoDB و CockroachDB.
\n\nالهدف الرئيسي لـ Prisma هو جعل العمل مع قواعد البيانات آمنًا وفعالًا ومريحًا. بفضل التكامل مع TypeScript، تحصل على الإكمال التلقائي والتحقق من الأنواع على مستوى التجميع، مما يقلل بشكل كبير من أخطاء وقت التشغيل. يتكون Prisma من ثلاثة مكونات رئيسية:
\n\n- \n
- Prisma Client — عميل تم إنشاؤه تلقائيًا للعمل مع قاعدة البيانات \n
- Prisma Migrate — نظام إدارة الترحيلات \n
- Prisma Studio — واجهة رسومية لعرض وتحرير البيانات \n
تثبيت Prisma
\n\nيتم تثبيت Prisma في مشروع TypeScript عبر npm. للبدء، أنشئ مشروعًا جديدًا:
\n\nmkdir my-prisma-project\ncd my-prisma-project\nnpm init -y\n\nقم بتثبيت Prisma CLI و Prisma Client:
\n\nnpm install prisma @prisma/client --save\n\nقم بتهيئة Prisma في المشروع:
\n\nnpx prisma init\n\nسينشئ هذا الأمر دليلاً باسم prisma مع ملف schema.prisma وملف .env لمتغيرات البيئة.
بداية سريعة: مثال كود
\n\nلننظر في إنشاء تطبيق بسيط لإدارة المستخدمين. أولاً، حدد النموذج في prisma/schema.prisma:
generator client {\n provider = "prisma-client-js"\n}\n\ndatasource db {\n provider = "sqlite"\n url = env("DATABASE_URL")\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n name String?\n posts Post[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Post {\n id Int @id @default(autoincrement())\n title String\n content String?\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id])\n authorId Int\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nنفذ الترحيل لإنشاء الجداول في SQLite:
\n\nnpx prisma migrate dev --name init\n\nالآن، أنشئ ملفًا باسم index.ts مع مثال للاستخدام:
import { PrismaClient } from '@prisma/client'\n\nconst prisma = new PrismaClient()\n\nasync function main() {\n // إنشاء مستخدم\n const user = await prisma.user.create({\n data: {\n email: 'alice@example.com',\n name: 'Alice',\n posts: {\n create: { title: 'Hello World' }\n }\n }\n })\n console.log('Created user:', user)\n\n // الحصول على جميع المستخدمين مع منشوراتهم\n const users = await prisma.user.findMany({\n include: { posts: true }\n })\n console.log('All users:', JSON.stringify(users, null, 2))\n}\n\nmain()\n .catch(e => console.error(e))\n .finally(async () => await prisma.$disconnect())\n\nقم بتشغيل الكود:
\n\nnpx ts-node index.ts\n\nالطرق الأساسية لـ Prisma Client
\n\n1. findUnique
\nما يفعله: يبحث عن سجل فريد بناءً على معرف فريد (id، email، إلخ).
\nالمعلمات:
\n- \n
where— كائن بشروط البحث (إلزامي) \n include— (اختياري) لتضمين النماذج المرتبطة \n select— (اختياري) لاختيار حقول محددة \n
مثال:
\nconst user = await prisma.user.findUni