برنامه نویسی

ORM، Prisma، و چگونه باید پروژه پایگاه داده پس زمینه بعدی خود را بسازید

Prisma یک ابزار برتر نقشه برداری شی رابطه ای (ORM) در اکوسیستم Node.js است. این قدرتمند در عین حال ساده و آسان برای استفاده است. یک تیم بزرگ نیز از آن پشتیبانی می‌کند، و از پذیرش گسترده‌ای توسط انجمن Node.js برخوردار شده است. Prisma چنان شهرت عالی کسب کرده است که ما آن را در پشته فناوری خود برای Amplication گنجانده ایم. ما نه تنها از Prisma برای برنامه های کاربردی تولید شده خود استفاده می کنیم، بلکه از آن در پشته فناوری داخلی خود نیز استفاده می کنیم.

در این مقاله برخی از ویژگی های پریسما و تیمی که از آن پشتیبانی می کند را از نزدیک بررسی خواهیم کرد. Prisma به اندازه خود Node برای Amplication حیاتی شده است، و من به شدت توصیه می کنم آن را برای پروژه بعدی Node خود در نظر بگیرید.

معرفی پریسما

Prisma یکی از محبوب ترین ORM ها در اکوسیستم گره ها است و در دو سال گذشته شاهد رشد مداوم در جامعه بوده است. بیشتر این به تیمی مربوط می شود که از محصول حمایت می کند. Prisma منبع باز و تحت مجوز Apache-2.0 است که آن را برای پروژه های شما بسیار انعطاف پذیر می کند – مجموعه ای چشمگیر از سرمایه گذاران، مانند اعضای کلیدی Heroku، Netlify و GraphQL از آن پشتیبانی می کنند. پشتیبانی از Prisma ادامه دارد و قوی است، زیرا تیم به طور مداوم با نسخه‌های معمولی که باگ‌ها، مشکلات عملکرد و سایر پیشرفت‌ها را برطرف می‌کند، بهبود می‌بخشد.

یکی از مهمترین ملاحظات هنگام انتخاب یک پشته فناوری، اطمینان از اینکه هر برنامه یا بسته ای که استفاده می کنم به خوبی پشتیبانی می شود. مهم نیست که یک بسته چقدر کارآمد یا پیچیده باشد، اگر پشتیبانی کمتری داشته باشد، می‌تواند ساعت‌های ناگفته‌ای را به پروژه شما اضافه کند، زیرا سعی می‌کنید آن را در یک مورد استفاده لبه قرار دهید یا یک اشکال را برطرف کنید. محبوبیت Prisma و وضعیت منبع باز به این معنی است که نه تنها توسط یک تیم داخلی فوق العاده پشتیبانی می شود، بلکه پشتیبانی جامعه نیز باورنکردنی است. توسعه دهندگان پریسما تحصیل کرده و با تجربه زیادی در انجمن های معمولی وجود دارند.

Prisma بسته ای است که کاربران جدید را دعوت می کند. این به خوبی مستند شده و برای اولین یا 50مین پروژه Node شما مناسب است. اسناد آنها حاوی اطلاعات جامع در مورد ویژگی های موجود است. همچنین می‌توانید به چندین راهنما، از جمله «نحوه‌های مقدماتی»، مراحل استقرار برنامه‌هایی که از Prisma استفاده می‌کنند، و دستورالعمل‌های مهاجرت از یک ORM دیگر دسترسی داشته باشید. راهنماها کامل، به روز و به راحتی قابل پیگیری هستند. علاوه بر این، تیم Prisma اطمینان حاصل کرده است که تجربه شما در استفاده از ORM آنها تا حد امکان بدون درد است.

چرا از پریسما استفاده کنیم؟

در ساده ترین حالت، Prisma می تواند به پایگاه داده شما به عنوان یک ORM دسترسی داشته باشد. به عنوان بخشی از مجموعه محصولات خود، Prisma یک “Client API” ارائه می دهد که می تواند نوشتن حتی پیچیده ترین عملیات پایگاه داده را ساده کند. اما جایی که پریسما می‌درخشد، توانایی آن در مدیریت عملیات پرس‌وجوی پیچیده است.

API Prisma به شما امکان می دهد به راحتی از روابط عبور کنید. در زیر نمونه‌ای از برنامه‌ای است که از آموزش Prisma Client به پایگاه داده دسترسی دارد. ابتدا، برنامه با استفاده از ویژگی های پیمایش از پست وبلاگ به نویسنده و در نهایت به نمایه نویسنده، به نمایه نویسنده دسترسی پیدا می کند:

const authorProfile: Profile | null = await prisma.post
  .findUnique({ where: { id: 1 } })
  .author()
  .profile();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همچنین با افشای آرگومان‌هایی برای نظم، محدودیت‌ها و مکان‌نماها، صفحه‌بندی را آسان می‌کند. در زیر می‌توانید نمونه‌ای را مشاهده کنید که در آن می‌توانید از کلاینت برای گرفتن پنج پست از پایگاه داده با شروع از پست استفاده کنید. id=2:

// Find the next 5 posts after post id 2
const paginatedPosts3: Post[] = await prisma.post.findMany({
  take: 5,
  cursor: {
    id: 2,
  },
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همچنین امکان پرس و جوهای انبوه مانند sum و count را فراهم می کند:

// Group users by country
const groupUsers = await prisma.User.groupBy({
  by: ["country"],
  _count: {
    id: true,
  },
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در کنار این ویژگی‌ها، کلاینت پریسما تراکنش‌ها را تسهیل می‌کند، میان‌افزار و اجرای سؤالات خام را در بر می‌گیرد و به ساده‌سازی ثبت‌نام کمک می‌کند.

اما محدود کردن قابلیت‌های پریسما به خواندن یا نوشتن داده‌ها یک آسیب بزرگ خواهد بود. یکی دیگر از جنبه های مهم Prisma نحوه مدیریت مهاجرت ها است. Prisma از رویکردهای SDL-first و code-first برای مدل سازی ساختار داده شما در کد پشتیبانی می کند. من روش کد اول را برای نوشتن پایگاه داده شما در صورت ایجاد یک برنامه جدید پیشنهاد می کنم. با این حال، ایجاد طرحواره Prisma با استفاده از پایگاه داده برای پایگاه های داده موجود می تواند آسان تر باشد.

اگر تصمیم دارید با رویکرد کد اول کار کنید، می توانید از Prisma Migrate برای ایجاد جداول در پایگاه داده خود استفاده کنید. با نوشتن تعریف طرحواره خود با استفاده از زبان نشانه گذاری Prisma شروع کنید. نمونه زیر نمونه ای از آموزش پریسما است:

model Post {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  title     String   @db.VarChar(255)
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
}

model Profile {
  id     Int     @id @default(autoincrement())
  bio    String?
  user   User    @relation(fields: [userId], references: [id])
  userId Int     @unique
}

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
  posts   Post[]
  profile profile?
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با راه اندازی طرحواره خود، می توانید پایگاه داده خود را با انتخاب یکی از ارائه دهندگان پشتیبانی شده توسط Prisma آماده کنید. در مثال زیر، من از PostgreSQL استفاده می کنم، اما چندین گزینه در دسترس مانند MySQL، SQLite، MongoDB، CockroachDB و Microsoft SQL Server وجود دارد:

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با مجموعه طرح و ارائه دهنده شما، Prisma اکنون می تواند شمای شما را به کد اجرایی تبدیل کند تا پایگاه داده شما را ایجاد کند:

-- CreateTable
CREATE TABLE "User" (
  "id" SERIAL,
  "name" VARCHAR(200) NOT NULL,
  PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "Post" (
  "id" SERIAL,
  "title" VARCHAR(150) NOT NULL,
  "published" BOOLEAN NOT NULL DEFAULT true,
  "authorId" INTEGER NOT NULL,
  PRIMARY KEY ("id")
);

-- AddForeignKey
ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به همین سادگی است. اگر از PostgreSQL به MySQL (یا هر ارائه دهنده دیگری) تغییر می کنید، ارائه دهنده خود را تغییر دهید و مهاجرت خود را دوباره بسازید. اگر نیاز به ایجاد داده‌های اولیه دارید، می‌توانید برنامه خود را به گونه‌ای پیکربندی کنید که بدانید داده‌های اولیه شما کجا هستند و از سرویس گیرنده Prisma برای درج هر داده‌ای که نیاز دارید استفاده کنید.

استفاده از Prisma With Amplication

البته، شما باید بتوانید داده ها را از پایگاه داده خود به کاربر خود برسانید. تقویت یک ایجاد خواهد کرد schema.prisma فایل از پیکربندی که در UI وارد کرده اید. این فایل شامل تمام فیلدها، انواع و روابط لازم برای ایجاد پایگاه داده شما خواهد بود. هر موجودیتی که در UI ایجاد می کنید یک سری کلاس نیز ایجاد می کند. از آنجایی که Amplication بر روی NestJS ساخته شده است، ما یک ماژول، یک حل‌کننده و یک سرویس برای تسهیل رسیدگی به درخواست‌ها به API برای موجودیت ایجاد می‌کنیم.

اول، سرویس جایی است که ما از Prisma برای پرس و جو یا تغییر داده ها در پایگاه داده استفاده می کنیم. ما کلاس‌های تایپ‌شده را برای نمایش آرگومان‌های هر پرس و جو، مانند CustomerFindManyArguments، تولید کردیم. سپس متدهای wrapper را برای Prisma ایجاد می کنیم مانند findMany، که تابع findMany مجموعه مشتری را از کلاینت Prisma فراخوانی می کند و نمونه CustomerFinderManyArguments را به آن ارسال می کند. مشتری Prisma از این آرگومان ها برای فیلتر کردن داده های شما یا استفاده از صفحه بندی استفاده می کند.

سپس Amplication کنترل کننده های REST API و حل کننده های GraphQL هر موجودیت را ایجاد می کند. ابتدا کلاس های تایپ شده را تولید می کنیم. ما از همان تعریف موجودی که برای ساختن ارائه کردید استفاده می کنیم prisma.schema. این به همگام سازی API و پایگاه داده در مورد فیلدها و انواع مورد نیاز کمک می کند. سپس می‌توانیم از آن کلاس‌های تایپ‌شده برای اطلاع Swagger از ساختار API برنامه استفاده کنیم. در نهایت ماژول ها را در اپلیکیشن و سپس اپلیکیشن را در Swagger ثبت می کنیم. متوجه خواهید شد که فیلدهای موجود در شما Args کلاس ها تزئین شده اند APIProperty. این به Swagger تمام جزئیات مورد نیاز برای ایجاد اسناد API شما را می دهد.

نگاهی دقیق تر به کلاس CustomerFinderManyArguments نشان می دهد که ما از دکوراتورها نیز استفاده می کنیم @nestjs/graphql. با این کار می توانیم GraphQL فیلدهای موجود در داده های شما را ارائه کنیم. سپس یک حل‌کننده ایجاد می‌کنیم تا برنامه از طریق GraphQL چه چیزی را نشان دهد. حل کننده ها به یک سرویس موجودی که با برنامه شما ایجاد شده است بستگی دارد.

در نهایت، Amplication اسناد Swagger را برای API شما ایجاد می کند که به طور کامل انتقال داده های سرتاسر شما را نشان می دهد.

می توانید بررسی کنید CustomerServiceBase در برنامه نمونه ما برای نگاه دقیق تر.

Swagger UI

شکل 1: Swagger UI (منبع: Amplication)

بسته بندی

اکنون می توانید ببینید که چرا Prisma در پشته Amplication یکپارچه شده است. این ساده و آسان برای استفاده است اما قدرتمند و کاملاً برجسته است. تیمی که از این محصول حمایت می کند، کار فوق العاده ای در بهبود آن نیز انجام داده است. در نتیجه، Prisma بخشی از پشته ما برای آینده قابل پیش بینی خواهد بود، و توصیه می کنیم آن را نیز بخشی از خود کنید.

اگر درباره Amplication و پتانسیل آن برای ساده‌سازی گردش کار توسعه خود هیجان‌زده هستید، لطفاً با ستاره‌دار کردن مخزن ما در GitHub، حمایت خود را نشان دهید. 🌟 شما به ما کمک می کند تا به توسعه دهندگان بیشتری دسترسی پیدا کنیم و به بهبود پلتفرم ادامه دهیم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا