Prisma یک ORM منبع باز است که به شما امکان می دهد به راحتی پایگاه داده خود را مدیریت کرده و با آن تعامل داشته باشید. در این راهنما، ویژگیها، مزایا و موارد استفاده Prisma را مورد بحث قرار میدهیم تا به شما کمک کنیم تصمیم بگیرید که آیا انتخاب مناسبی برای پروژه بعدی شما است یا خیر.
ORM ها چیست؟
ORM ها انتزاع پایگاه داده سطح بالا را ارائه می دهند. آنها یک رابط برنامه نویسی را از طریق اشیا برای ایجاد، خواندن، حذف و دستکاری داده ها در معرض دید قرار می دهند در حالی که برخی از پیچیدگی های پایگاه داده را پنهان می کنند.
ایده ORM ها این است که شما مدل های خود را به عنوان کلاس هایی تعریف می کنید که به جداول در یک پایگاه داده نگاشت می شوند. کلاس ها و نمونه های آنها یک API برنامه نویسی را برای خواندن و نوشتن داده ها در پایگاه داده در اختیار شما قرار می دهند.
دو الگوی ORM رایج وجود دارد: Active Record و Data Mapper که در نحوه انتقال داده ها بین اشیا و پایگاه داده متفاوت هستند. در حالی که هر دو الگو از شما میخواهند که کلاسها را بهعنوان بلوک ساختمان اصلی تعریف کنید، مهمترین تفاوت بین این دو این است که الگوی Data Mapper اشیاء درون حافظه را در کد برنامه از پایگاه داده جدا میکند و از لایه نگاشت داده برای انتقال دادهها بین دو در عمل، این بدان معنی است که با Data Mapper اشیاء درون حافظه (نماینده داده ها در پایگاه داده) حتی نمی دانند که یک پایگاه داده وجود دارد.
رکورد فعال
ORMهای ثبت فعال کلاسهای مدل را به جداول پایگاه داده که در آن ساختار دو نمایش نزدیک به هم مرتبط هستند، نگاشت میکنند، به عنوان مثال. هر فیلد در کلاس مدل یک ستون مطابق در جدول پایگاه داده خواهد داشت. نمونههایی از کلاسهای مدل، ردیفهای پایگاه داده را میپیچانند و هم دادهها و هم منطق دسترسی را برای مدیریت تغییرات مداوم در پایگاه داده حمل میکنند. علاوه بر این، کلاسهای مدل میتوانند منطق تجاری مختص دادههای مدل را حمل کنند.
کلاس مدل معمولاً متدهایی دارد که کارهای زیر را انجام می دهند:
نمونه ای از مدل را ازکوئری SQL بسازید.
یک نمونه جدید برای درج بعدی در جدول بسازید.
کوئری های SQL رایج مورد استفاده را بپیچید و اشیاء Active Record را برگردانید.
پایگاه داده را به روز کنید و داده های موجود در Active Record را در آن قرار دهید.
فیلدها را دریافت و تنظیم کنید.
پیاده سازی منطق کسب و کار
نقشهبردار دادهها
ORMهای مپ داده، برخلاف Active Record، نمایش دادهها را در حافظه برنامه از نمایش پایگاه داده جدا میکنند. جداسازی با الزام شما به تفکیک مسئولیت نقشه برداری به دو نوع کلاس به دست می آید:
کلاسهای موجودیت: نمایش موجودیتهایی که از پایگاهداده اطلاعی ندارند برنامه در حافظه
کلاس های Mapper: این کلاس ها دو مسئولیت دارند:
تبدیل داده ها بین دو نمایش.
تولید SQL لازم برای واکشی داده ها از پایگاه داده و تداوم تغییرات در پایگاه داده.
ORMهای Mapper داده، انعطافپذیری بیشتری را بین حوزه مشکل که در کد پیادهسازی میشود و پایگاه داده امکانپذیر میکنند. این به این دلیل است که الگوی نگاشت داده به شما این امکان را می دهد که روش های پیاده سازی پایگاه داده خود را پنهان کنید که راه ایده آلی برای فکر کردن به دامنه شما در پشت کل لایه نقشه برداری داده نیست.
یکی از دلایلی که ORMهای Mapper داده سنتی این کار را انجام میدهند به دلیل ساختار سازمانهایی است که در آن دو مسئولیت توسط تیمهای جداگانه، به عنوان مثال، DBAs و توسعهدهندگان باطن انجام میشود.
در واقع، همه ORM های Data Mapper به شدت از این الگو پیروی نمی کنند. به عنوان مثال، TypeORM، یک ORM محبوب در اکوسیستم TypeScript که از Active Record و Data Mapper پشتیبانی می کند، رویکرد زیر را برای Data Mapper اتخاذ می کند:
کلاسهای موجودیت از دکوراتورها (Column@) برای نگاشت ویژگیهای کلاس به ستونهای جدول استفاده میکنند و از پایگاه داده آگاه هستند.
به جای کلاس های mapper، کلاس های مخزن برای کوئری از پایگاه داده استفاده می شود و ممکن است شامل کوئری های سفارشی باشد. مخازن از دکوراتورها برای تعیین نگاشت بین ویژگی های موجودیت و ستون های پایگاه داده استفاده می کنند.
پریسما (Prisma) چیست؟
Prisma یک ORM برای Node.js و Typescript است که به عنوان جایگزینی برای نوشتن SQL ساده یا استفاده از سایر ابزارهای دسترسی به پایگاه داده مانند Knex یا Sequelize عمل می کند. دسترسی و مدیریت پایگاه داده را با ارائه یک سازنده کوئری و تولید کننده خودکار به توسعه دهندگان ساده می کند.
Error: Forbidden
Your client does not have permission to get URL /embed/episode/1eLWFXKYgVTMCMYkuRF2Pz from this server.
تیم Prisma Labs ،Prisma را در سال 2016 تأسیس کرد و هدف آن این بود که کار با پایگاههای داده را سرگرمکنندهتر، سازندهتر و لذتبخشتر کند. آنها با Graphcool و Prisma 1 شروع کردند، جایی که هر دو بر ساده سازی ساخت و استقرار API GraphQL متمرکز بودند.
با تکامل و محبوبیت این پروژه، Prisma به یک پروژه مستقل تبدیل شد که با نام Prisma 2.0 در سال 2020 منتشر شد. ویژگی های اصلی آن عبارتند از:
Prisma Client، یک سازنده کوئری که به صورت خودکار تولید شده و ایمن است برای دسترسی به پایگاه داده در Node.js و Typescript
Prisma Studio: یک ویرایشگر بصری برای مدیریت گردش کار پایگاه داده شما
مایگرشن خودکار
عملکرد بهبود یافته برای تعاملات پایگاه داده
Prisma چگونه کار می کند؟
بیایید با نحوه کار Prisma آشنا شویم. همه چیز با اسکیمای Prisma شروع می شود، جایی که می توانید مدل های پایگاه داده و روابط را با استفاده از زبان اسکیمای Prisma، یک زبان مدل سازی داده بصری تر تعریف کنید.
شما می توانید اسکیمای Prisma را از ابتدا در پروژه خود بنویسید یا آن را از یک پایگاه داده موجود تولید کنید. از آنجایی که Prisma یک پایگاه داده آگنوستیک است، بیایید نگاهی گذرا به نحوه تعریف یک مدل اسکیمای در Prisma برای پایگاههای داده رابطهای و پایگاههای داده غیر رابطه ای بیندازیم.
در اینجا نمونه ای از مدل اسکیمای برای پایگاه داده های رابطه ای با استفاده از SQLite به عنوان ارائه دهنده آورده شده است:
schema.prisma
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Author {
author_id Int @id @default(autoincrement())
author_name String
email String
created_at DateTime
// Define the relation to the Posts model
posts Post[]
// Define the relation to the Comments model
comments Comment[]
}
// Define the Posts model
model Post {
post_id Int @id @default(autoincrement())
title String
content String
created_at DateTime
// Define the relation to the Author model
author Author @relation(fields: [author_id], references: [author_id])
author_id Int
// Define the relation to the Comments model
comments Comment[]
}
// Define the Comments model
model Comment {
comment_id Int @id @default(autoincrement())
content String
created_at DateTime
// Define the relation to the Author model
author Author @relation(fields: [author_id], references: [author_id])
author_id Int
// Define the relation to the Post model
post Post @relation(fields: [post_id], references: [post_id])
post_id Int
}
در اینجا نمونه ای از مدل اسکیمای برای پایگاه های داده غیر رابطه ای با استفاده از MongoDB به عنوان ارائه دهنده آورده شده است:
schema.prisma
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
// Define the Author model
model Author {
id String @id @default(auto()) @map("_id") @db.ObjectId
authorName String
email String @unique
createdAt DateTime @default(now())
posts Post[]
comments Comment[]
}
// Define the Post model
model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
title String
content String?
createdAt DateTime @default(now())
author Author @relation(fields: [authorId], references: [id])
authorId String @db.ObjectId
comments Comment[]
}
// Define the Comment model
model Comment {
id String @id @default(auto()) @map("_id") @db.ObjectId
content String
created_at DateTime @default(now())
author Author @relation(fields: [authorId], references: [id])
authorId String @db.ObjectId
post Post @relation(fields: [postId], references: [id])
postId String @db.ObjectId
}
در این دو اسکیما، ابتدا منبع داده خود را با تعیین اتصال پایگاه داده خود با استفاده از یک متغیر محیطی برای حمل رشته اتصال پیکربندی کردیم. در مثال های بالا، ما از sqlite و mongodb استفاده می کنیم. با این حال، تطبیق آن با هر ارائه دهنده پایگاه داده دیگری آسان است.
فرض کنید ارائه دهنده پایگاه داده شما PostgreSQL است. تنها چیزی که نیاز دارید این است که رشته اتصال را با استفاده از متغیر محیط بارگیری کنید و ارائه دهنده را به عنوان postgresql مشخص کنید:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
همچنین، ما ژنراتور را پیکربندی کردیم، که مشخص میکند میخواهیم Prisma Client را تولید کنیم.
در نهایت، ما برخی از مدلهای داده را تعریف کردیم: نویسنده، پستها و نظرات. یک مدل دارای دو کارکرد اصلی است: نمایش یک جدول در یک پایگاه داده رابطهای یا مجموعهای در یک پایگاه داده غیرمرتبط مانند MongoDB، و ارائه پایهای برای کوئریها در Prisma Client API.
چرا از پریسما استفاده کنیم؟
قبل از Prisma، کار با اشیاء ORM پیچیده و کوئری های SQL با استفاده از پایگاههای داده رابطهای اغلب باعث ایجاد گلوگاههای مهم در فرآیند توسعه میشد.
Prisma با ارائه APIهای تمیز و ایمن برای ارسال کوئری های پایگاه داده که اشیاء ساده جاوا اسکریپت قدیمی را برمی گرداند، کار توسعه دهندگان را با کوئری های پایگاه داده آسان تر می کند. برخی از مزایای آن عبارتند از:
عملکرد: Prisma یک ORM سریع و کارآمد است که به راحتی در چارچوب مورد نظر شما ادغام می شود و دسترسی به پایگاه داده را ساده می کند.
DX: هدف اصلی Prisma همیشه آسانتر کردن زندگی توسعهدهندگان در هنگام کار با پایگاههای داده و توسعه برنامهها بوده است.
اندازه بسته: Prisma یک کتابخانه نسبتا کوچک در اندازه است. همچنین، نمونه Prisma Client که در زمان ساخت ایجاد میشود، در مقایسه با سایر کتابخانههای ORM، حجم بستهای حتی کوچکتر را به همراه دارد.
انجمن و اکوسیستم: جامعه و اکوسیستم Prisma از زمان انتشار Prisma 2.0 به رشد و فعال تر شدن ادامه داده است.
مستندات: مستندات Prisma بسیار جامع و آسان برای پیمایش است و مثالهای واضح، راهنماها و آموزشهای ویدیویی را ارائه میکند.
منحنی یادگیری: از آنجایی که هدف Prisma این است که کار با پایگاه های داده را برای توسعه دهندگان آسان تر و سازنده تر کند، منحنی یادگیری آن نسبتا پایین است. شروع کار با Prisma آسان است و مستندات و آموزش های عالی آن نیز به این امر کمک می کند
ادغام: Prisma یک پایگاه داده آگنوستیک است، که کار با Prisma را برای توسعه دهندگانی که با پایگاه داده های مختلف کار می کنند آسان می کند. Prisma همچنین هنگام ادغام با چارچوب هایی مانند Next.js یا NestJS انعطاف پذیر است و کار با تنظیمات سمت سرور را آسان تر می کند.
Prisma نه تنها پایگاه داده آگنوستیک است، بلکه پلتفرم نیز آگنوستیک است. این با چندین فنآوری frontend سازگار است، به این معنی که میتوانیم از Prisma برای عملیات پایگاه داده در حین کار با APIهای Backend در Next.js، Vue.js، Angular و موارد دیگر استفاده کنیم.
اجازه دهید Next.js را به عنوان مثال در نظر بگیریم. بعد با پشتیبانی از SSG و SSR شکاف بین کلاینت و سرور را پر می کند. توسعه دهندگان Frontend که با پایگاه های داده در برنامه Next.js کار می کنند می توانند با استفاده از مسیرهای API در زمان ساخت (SSG) یا در طول زمان درخواست (SSR) به پایگاه داده خود با Prisma دسترسی داشته باشند.
معایب احتمالی پریسما که باید در نظر گرفته شوند
در حالی که ما دیدیم که Prisma چقدر می تواند عالی باشد، منصفانه است که برخی از معایب این ابزار را نیز مورد بحث قرار دهیم:
منحنی یادگیری: منحنی یادگیری Prisma برای توسعه دهندگانی که تازه وارد ORM می شوند، نسبتاً شیب دار است. توانایی استفاده بهینه از APIهای Prisma و همه چیزهایی که این ابزار ارائه می دهد می تواند برای توسعه دهندگان طاقت فرسا باشد و ممکن است مدتی طول بکشد تا به خوبی از Prisma استفاده کنند.
کنترل پایگاه داده محدود: اگر در حال ساختن یک پروژه قدیمی هستید که در آن باید کنترل کاملی بر پایگاه داده خود داشته باشید، Prisma ORM شما را در اینجا قرار می دهد زیرا تمام درخواست های SQL خام را برای شما انتزاعی می کند.
محدودیتهای پایگاه داده: در حالی که پریسما سعی میکند تا حد امکان نسبت به گستره پایگاههای دادهای که پشتیبانی میکند، به پایگاه دادهای که ممکن است ناشناس باشد، ممکن است از همه پایگاههای دادهای که ممکن است برای پروژه خود نیاز دارید پشتیبانی نکند. برای مثال، توسعهدهندهای که سعی میکند با Prisma و Oracle DB کار کند، مشکلات اتصال به پایگاه داده را خواهد داشت
با در نظر گرفتن این موضوع، معایب Prisma فقط باید بر موقعیتهای خاص و نیازهای پروژه تأثیر بگذارد. در بیشتر موارد، مزایای آن بیشتر از معایب است، و Prisma را به گزینه ای عالی برای بسیاری از توسعه دهندگان و پروژه ها تبدیل می کند.
شروع کار با Prisma
راه اندازی Prisma در پروژه شما آسان و ساده است. برای ادغام Prisma در پروژه خود به پیش نیازهای زیر نیاز دارید:
Node.js روی دستگاه شما نصب شده است
دسترسی به پایگاه داده Prisma پایگاه داده-اگنوستیک است. شما می توانید با پایگاه داده های MongoDB یا SQL مانند MySQL، SQLite، PostgreSQL و دیگران کار کنید.
هنگامی که این دو پیش نیاز را برآورده کردید، اگر از ابتدا شروع می کنید، یک پروژه Node.js جدید را راه اندازی کنید. این دستورات را در ترمینال دستگاه خود اجرا کنید:
mkdir node-prisma-project
cd node-prisma-project
npm init -y
اجرای این دستور یک دایرکتوری برای پروژه شما ایجاد می کند، به آن دایرکتوری تغییر می کند و سپس با استفاده از دستور، یک پروژه اصلی Node.js ایجاد می کند.
سپس، می توانید Prisma CLI را به عنوان یک وابستگی با استفاده از دستور زیر در پروژه نصب کنید:
npm install prisma / yarn add prisma
با استفاده از Prisma CLI، می توانید Prisma را در پروژه خود با استفاده از این دستور مقداردهی اولیه کنید:
npx prisma init
این یک دایرکتوری Prisma جدید در پوشه پروژه شما با یک فایل schema.prisma
ایجاد می کند و همچنین یک فایل env.
را برای متغیرهای محیطی مقداردهی می کند.
همچنین میتوانید مستقیماً پایگاه دادهای را که میخواهید هنگام راهاندازی Prisma ORM با دستور init Prisma CLI استفاده کنید، مشخص کنید:
npx prisma init --datasource-provider mysql
این یک دایرکتوری Prisma جدید با فایل schema.prisma
شما مانند دستور قبلی ایجاد می کند و MYSQL را به عنوان پایگاه داده شما پیکربندی می کند. با این کار می توانید داده های خود را مدل سازی کنید و پایگاه داده خود را با چند جداول ایجاد کنید.
در مرحله بعد، مدلی ایجاد کنید که جداول را در پایگاه داده شما نشان دهد و همچنین به عنوان پایه ای برای Prisma Client API تولید شده عمل کند:
//schema.prisma.ts
model User {
id Int @id @default(autoincrement())
name String
}
سپس دستور زیر را اجرا کنید:
npx prisma migrate dev -name migrationName
این فایل مایگرشن SQLite را در برابر پایگاه داده ای که ارائه کرده اید اجرا می کند و یک فایل مایگرشن SQLite جدید برای این مایگرشن در دایرکتوری prisma/migrations
ایجاد می کند. هنگامی که پایگاه داده SQLite خود را بارگیری مجدد می کنید، خواهید دید که اکنون جدولی به نام کاربران دارید که می توانید با آن تعامل داشته باشید.
به عنوان یک نکته مهم، همیشه به یاد داشته باشید که DATABASE_URL
خود را در مقدار env.
خود بگنجانید، خواه از MongoDB، SQLite، MySQL یا هر پایگاه داده دیگری استفاده می کنید.
بعد، بیایید سعی کنیم با ایجاد یک کاربر جدید در پایگاه داده خود، در پایگاه داده خود بنویسیم. یک فایل جدید به نام index.ts
در دایرکتوری ریشه پروژه خود ایجاد کنید:
// index.ts
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
const user = await prisma.user.create({
data: {
name: "Alice",
},
});
console.log(user);
}
main()
.then(async () => {
await prisma.$disconnect();
})
.catch(async (e) => {
console.error(e);
await prisma.$disconnect();
process.exit(1);
});
این قطعه کد تابعی به نام main
دارد که در انتهای اسکریپت فراخوانی می شود. PrismaClient نمونه سازی شده است، که نمایانگر رابط کوئری پایگاه داده شما است. در داخل تابع main
، یک کوئری برای ایجاد یک رکورد کاربر جدید در پایگاه داده با استفاده از متد create
در نمونه PrismaClient وجود دارد.
این دستور را برای اجرای اسکریپت اجرا کنید:
npx ts-node index.ts
سپس، می توانیم بررسی کنیم که آیا رکورد کاربر در پایگاه داده ما ذخیره شده است یا خیر: اکنون، میتوانید سایر عملیات پایگاه داده مانند گرفتن همه کاربران، گرفتن یک کاربر، یا ویرایش و حذف کاربران با استفاده از رابط کوئری نمونه PrismaClient را انجام دهید.
ویژگی های کلیدی Prisma که باید بدانید
اکنون که در مورد اینکه چرا باید از Prisma استفاده کنید و مراحل شروع سریع را بررسی کردیم، بحث کردیم، اجازه دهید برخی از ویژگی های برجسته Prisma را بررسی کنیم. این به ما کمک می کند تا در مورد آنچه که این ابزار را متمایز می کند و آن را به گزینه ای عالی برای پروژه های فرانت اند تبدیل می کند بیشتر بدانیم.
کلاینت Prisma
Prisma Client یک سازنده کوئری به صورت خودکار و ایمن است که بر اساس داده های شما طراحی شده است و راه راحت تری برای تعامل با پایگاه های داده ارائه می دهد. این ویژگی به این معنی است که شما نیازی به نوشتن کوئری های خام SQL به صورت دستی ندارید، که تعاملات پایگاه داده را ساده میکند و فرآیند توسعه frontend را بهبود میبخشد.
برای راه اندازی Prisma Client در پروژه خود، باید یک فایل اسکیمای Prisma با اتصال پایگاه داده خود، Prisma Client Generator و یک مدل تولید کنید. مثلا:
datasource db {
url = env("DATABASE_URL")
provider = "sqlite"
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
name String?
}
این ساختار پایگاه داده ما را مشخص می کند و مشخص می کند که از sqlite به عنوان پایگاه داده و از prisma-client-js به عنوان ارائه دهنده خود استفاده می کنیم. در نهایت، ما یک مدل ساده تعریف می کنیم که یک جدول پایگاه داده را در پایگاه داده SQLite ما به نام User تعریف می کند. همچنین ستون هایی را که این جدول دارد مشخص می کند.
برای شروع استفاده از Prisma Client برای جستجو در پایگاه داده خود، باید PrismaClient API را در برنامه سمت کلاینت خود وارد کنید:
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
در اینجا، نمونه جدیدی از کلاس PrismaClient
ارائه شده توسط کتابخانه Prisma Client را نمونهسازی میکنیم. این یک اتصال به پایگاه داده ایجاد می کند و Prisma Client API را راه اندازی می کند و به شما امکان می دهد تا در پایگاه داده خود کوئری کنید.
فرض کنید یک برنامه CRUD داریم که در آن می خواهیم کاربران جدیدی ایجاد کنیم. ما می توانیم این کار را با Prisma انجام دهیم:
const createUser = async (username, email) => {
try {
const newUser = await prisma.user.create({
data: {
username,
email,
},
});
return newUser;
} catch (error) {
console.error("Error creating user");
}
};
در اینجا، ما از نمونه Prisma Client برای تعامل با پایگاه داده خود استفاده می کنیم. ما یک کاربر با استفاده از نام کاربری و بار ایمیل ارسال شده از سمت کلاینت با استفاده از روش ایجاد ایجاد می کنیم. سپس کاربر را در پایگاه داده ذخیره می کنیم:
const getUsers = async () => {
try {
const users = await prisma.user.findMany();
return users;
} catch (error) {
console.error("Error getting users");
}
};
این بلوک کد از Prisma Client نمونه سازی شده برای بازیابی لیست کاربران از پایگاه داده با استفاده از متد findMany
استفاده می کند. این آرایه ای از کاربران را از پایگاه داده به ما برمی گرداند.
اسکیمای پریسما
اسکیما Prisma به عنوان فایل پیکربندی پایه برای راه اندازی Prisma شما عمل می کند. به عبارت دیگر، به عنوان پایه ای برای ساخت و ساختار مدل های پایگاه داده، روابط و محدودیت های شما عمل می کند.
فایل اسکیمای پریسما معمولاً schema.prisma
نامیده می شود و اساساً شامل سه بخش اصلی است: مولدها، منابع داده و مدل داده. بیایید با ژنراتورها شروع کنیم.
ژنراتورها بر اساس مدل داده تعیین می کنند که کلاینت باید چه چیزی تولید کند. آنها اساساً تعیین می کنند که با اجرای دستور prisma generate کدام دارایی ایجاد می شود. فیلد مولد می پذیرد:
ارائه دهنده: این فیلد ضروری است و مشخص می کند که از کدام کلاینت Prisma باید استفاده شود. در حال حاضر، فقط prisma-client-js به عنوان ارائه دهنده در دسترس است
خروجی: این فیلد اختیاری مکان کلاینت تولید شده را تعیین می کند
Preview Features: این فیلد اختیاری از IntelliSense برای مشاهده آخرین ویژگی های پیش نمایش موجود استفاده می کند
EngineType: این فیلد نوع موتور کوئری را برای دانلود و استفاده تعریف می کند.
در اینجا مثالی از نحوه نوشتن یک ژنراتور آورده شده است:
generator client {
provider = "prisma-client-js"
}
در مرحله بعد، منابع داده جزئیات منابع داده ای را که Prisma باید به آنها متصل شود، مشخص می کند. به عنوان مثال، اگر منبع داده خود را به عنوان sqlite مشخص کنید، Prisma دادهها را از SQLite DATABASE_URL که ارائه میدهید منبع میکند و با آن تعامل برقرار میکند:
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
در نهایت، مدل داده تعریف میکند که مدلهای برنامه کاربردی شما و روابط آنها چگونه باید به نظر برسند:
model User {
id String @id @default(uuid())
name String?
}
در اینجا مدل داده خود را مشخص کرده و نام آن را User می گذاریم. یک مدل در Prisma اساسا یک جدول (پایگاه داده رابطه ای) یا یک مجموعه (پایگاه داده غیر رابطه ای) را نشان می دهد. این مدل دارای دو فیلد است که با اجرای مایگرشن اولیه ایجاد می شود. بعداً در این مورد بیشتر بحث خواهیم کرد.
Prisma Migrate
Prisma Migrate به خودکارسازی فرآیند مدیریت تغییرات در اسکیما پایگاه داده پایگاه کد شما کمک می کند. این یک تاریخچه از فایل مایگرشن تولید می کند و به شما امکان می دهد که اسکیما پایگاه داده خود را با اسکیما Prisma خود هماهنگ کنید، زیرا در طول توسعه و تولید تغییر می کند.
بدون Prisma، توسعه دهندگان باید به صورت دستی اسکریپت های SQL خود را برای انجام مایگرشن بنویسند. Prisma Migrate فرآیند مدیریت تغییرات اسکیمای پایگاه داده را سادهتر و توسعهدهندهتر میکند.
برای شروع با Prisma Migrate، یک بار دیگر باید ابتدا اسکیما Prisma خود را ایجاد کنید:
schema.prisma
datasource db {
url = env("DATABASE_URL")
provider = "sqlite"
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
name String?
}
سپس، دستور migration را برای ایجاد اولین مایگرشن خود اجرا می کنیم:
npx prisma migrate dev -name init
پس از انجام، باید یک پیام موفقیت آمیز در ترمینال خواهید دید.
اکنون، اسکیما Prisma شما با اسکیما پایگاه داده شما هماهنگ است. همانطور که در تصویر بالا نشان داده شده است، اکنون باید یک تاریخچه مایگرشن را مشاهده کنید.
توجه داشته باشید که باید مقدار فیلد env("DATABASE_URL") را با آدرس پایگاه داده واقعی خود در فایل env. جایگزین کنید.
فرض کنید که این اسکیما را برای برنامه خود تعریف کرده ایم و تصمیم می گیریم تغییری در مدل از پیش تعریف شده ایجاد کنیم تا یک فیلد جدید به نام آدرس اضافه کنیم. به یاد داشته باشید که مدل در حال حاضر جدولی به نام User در پایگاه داده SQLite ما ایجاد می کند. حالا بیایید فیلد آدرس را به اسکیمای اضافه کنیم:
npx prisma migrate dev --name add_address_field
اکنون، شما باید یک سابقه مایگرشن جدید داشته باشید. شما می توانید تغییرات را کنترل و اجرا کنید. به این ترتیب Prisma مایگرشن های پایگاه داده را ساده می کند و فرآیند را کمتر پیچیده می کند.
مدل های پریسما
مدل Prisma یک جدول را در پایگاه داده شما نشان می دهد و به عنوان خط پایه برای داده های شما عمل می کند در حالی که یک اسکیما واره قوی تایپ شده برای برنامه شما ارائه می دهد. مدل ها ساختار داده ها را با مشخص کردن موارد زیر تعریف می کنند:
فیلدها یا ستون ها و انواع داده های آنها
نقشههای جداول (برای پایگاههای اطلاعاتی رابطهای) یا مجموعهها (پایگاههای اطلاعاتی غیر رابطهای)
کلیدهای خارجی
کلیدهای اصلی
و سایر ویژگی های پایگاه داده
آنها همچنین شالوده کوئری های موجود در Prisma Client API تولید شده را تشکیل می دهند.
بیایید یک پلتفرم را با چند کاربر و پست مثال بزنیم تا نحوه عملکرد مدلها را بهتر نشان دهیم:
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String
name String?
posts Post[]
@@map("users")
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
userId Int
user User @relation(fields: [userId], references: [id])
@@map("posts")
}
در اینجا دو مدل مرتبط را از پیش تعریف کردیم.
مدل User نشان دهنده یک کاربر در سیستم است و دارای یک شناسه است که به عنوان کلید اصلی آن به همراه فیلدهای ایمیل، نام و پست است که یک رابطه یک به چند را با مدل Post تنظیم می کند. صفت map@
نام جدول را در پایگاه داده هنگام ایجاد آن مشخص می کند.
مدل Post نشان دهنده پستی است که توسط یک کاربر ایجاد شده است. دارای فیلدهای شناسه، عنوان، محتوا و شناسه کاربر است که به عنوان کلیدهای خارجی ما عمل می کنند - در این مثال، برای ارجاع یا ایجاد رابطه بین یک کاربر و پست های او. ویژگی relation@
به طور خاص رابطه را بیان می کند و فیلدهایی را که برای اتصال مدل ها استفاده می شود را نشان می دهد.
درون نگری و مایگرشن
Introspection بیشتر برای تولید نسخه اولیه مدل داده هنگام اضافه کردن Prisma به یک پروژه موجود استفاده می شود. عملکرد کلیدی درون نگری پر کردن اسکیمای پریسما با مدل داده ای است که اسکیمای پایگاه داده فعلی را منعکس می کند.
از موارد برای پریسما استفاده کنید
یکی از موارد کاربردی مرتبط و کاربردی برای Prisma ساخت یک برنامه کاربردی سمت سرور است که با پایگاه داده تعامل دارد. برای توسعه برنامه های وب با تعاملات مکرر پایگاه داده عالی است. به عنوان مثال، برای یک برنامه وب ساده که عملیات CRUD را در سمت سرور انجام می دهد، Prisma به ساده سازی این عملیات کمک می کند و در عین حال ایمنی نوع را تضمین می کند.
Prisma همچنین در طول توسعه API مفید است. با Prisma، میتوانید عملیات پایگاه داده مانند واکشی دادهها و جهشها را هنگام ایجاد نقاط پایانی API ساده کنید، چه در حال ساخت APIهای RESTful یا GraphQL باشید.
ثالثاً، اگر به دنبال حذف کوئری های پیچیده پایگاه داده مرسوم و گردش کار هستید، Prisma گزینه بسیار خوبی است. این به شما و سایر توسعه دهندگان تیمتان اجازه می دهد تا بیشتر روی منطق تجاری و جنبه های توسعه تمرکز کنید و در نتیجه بهره وری را بهبود ببخشید.
همانطور که قبلا ذکر شد، Prisma بسیاری از گردشهای کاری پایگاه داده را که توسعهدهندگان هنگام تعامل با پایگاههای داده به آن نیاز دارند، پوشش میدهد. به عنوان مثال می توان به کوئری پایگاه داده با Prisma Client، مدل سازی داده ها با استفاده از اسکیمای Prisma، مایگرشن با Prisma Migrate، بذر با استفاده از دستور prisma db seed و بسیاری از گردش های کاری دیگر اشاره کرد.
با این حال، Prisma ممکن است مورد استفاده خوبی نباشد اگر بخواهید کنترل کاملی بر کوئری های پایگاه داده خود داشته باشید، زیرا کوئری های پایگاه داده سطح پایین را انتزاعی می کند. به عنوان مثال، اگر می خواهید با کوئری های SQL خام یا ساده کار کنید، Prisma Client - که برای کوئری در پایگاه داده است در این سناریو کمتر موثر خواهد بود.
Prisma در مقابل SQL ساده در مقابل سازندگان کوئری SQL
یکی از دلایل اصلی ایجاد Prisma ORM این بود که زندگی را برای توسعه دهندگان در هنگام تعامل یا کوئری از پایگاه های داده و در عین حال ارائه یک API تمیز و ایمن برای ارسال یا کار با این کوئریها آسان تر کند. این به Prisma برتری نسبت به سازندگانکوئری SQL و SQL ساده از چندین جهت می دهد.
سطح انتزاع
قبل از Prisma، ابزارهای پایگاه دادهای که در اکوسیستم Node و TypeScript وجود داشتند، از توسعهدهندگان میخواستند بین بهرهوری و انتزاع یا کنترل، انتخاب سختی داشته باشند.
برخی از توسعه دهندگان باید با درایورهای پایگاه داده سطح پایین و سازندگان کوئری کار کنند تا کنترل بیشتری بر کوئریها، تراکنش ها و بهینه سازی پایگاه داده خود داشته باشند.
در همین حال، انتخاب بهرهوری به معنای استفاده از ORMهایی با سطوح بالاتر انتزاع است که ویژگیهایی مانند مایگرشن، تولید کوئری خودکار، ایمنی نوع، مدلسازی داده و موارد دیگر را ارائه میدهد.
امکانات
Prisma ORM مدرن را برای Node.js و TypeScript ارائه میکند در حالی که ویژگیهای خارج از جعبه مانند مایگرشنهای اسکیمای، دسترسی به پایگاه داده ایمن تایپ، بذرسازی و سازندگان کوئری را ارائه میکند که کوئری های SQL مؤثر را ارائه میکنند.
کار با SQL ساده به توسعه دهندگان کنترل و دسترسی بیشتری بر کوئریها می دهد. با این حال، نوشتن کوئری های خام SQL میتواند زمانبر باشد و از نظر تایپ کاملاً ایمن نباشد. سازندگانکوئری SQL دقیقاً مانند Prisma برای تعاملات پایگاه داده انتزاعی می شوند، اما معمولاً فاقد ویژگی هایی مانند ایمنی نوع و مایگرشن اسکیمای هستند.
کارایی
عملکرد پریسما عمیقاً ریشه در انتزاع سطح بالایی از کوئریها و تعاملات پایگاه داده دارد در حالی که کوئری های ایمن برای نوع ارائه می دهد. این به توسعه دهندگان اجازه می دهد تا با ایجاد کوئری های مبتنی بر SQL از اسکیما Prisma، واکشی داده ها را انجام دهند.
عملکرد عالی آن را می توان در روشی که بهینه سازیکوئری پایگاه داده را با به حداقل رساندن تعداد کوئری های جداگانه ایجاد شده در پایگاه داده، به ویژه برای پایگاه های داده رابطه ای انجام می دهد، مشاهده کرد.
عملکرد با SQL ساده به طور کلی به توسعه دهنده بستگی دارد که کوئری ها را بنویسد، زیرا SQL ساده کنترل بیشتری را برای تعاملات پایگاه داده فراهم می کند. یک کوئری SQL به خوبی بهینه شده می تواند عملکرد خوبی داشته باشد، اما نوشتن این موارد می تواند به زمان، تلاش و مقداری آزمون و خطا نیاز داشته باشد – و یک کوئری بهینه شده ضعیف می تواند بر عملکرد تأثیر بگذارد.
در همین حال، مانند Prisma، سازندگان کوئری های SQL مانند Knex یا Sequelize به توسعه دهندگان اجازه می دهند کوئری های خود را با استفاده از رابط خود بسازند و به آنها کنترل بیشتری بر ساخت کوئری می دهد. این سازندگان کوئری ممکن است به اندازه Prisma کارآمد نباشند، زیرا توسعه دهندگان هنوز باید اطمینان حاصل کنند که کوئری های آنها به درستی برای عملکرد بهینه شده است.
مستندات
Prisma مستندات بسیار جامعی را ارائه می دهد. این اسناد همه چیز را از اصول اولیه چیستی Prisma و چرایی ایجاد آن گرفته تا نصب، راهنماهای شروع کار و آموزش های ویدیویی، موضوعات پیشرفته و مراجع API را پوشش می دهد.
با Plain SQL، توسعه دهندگان عمدتاً مجبورند از پایگاه داده و اسناد SQL استفاده کنند زیرا به دنبال ایجاد کوئری های خود از ابتدا هستند. سازندگان کوئری محبوب مانند Knex و Sequelize نیز اسناد بسیار خوب و محکمی دارند که منحنی یادگیری را برای توسعه دهندگان بسیار آسان می کند.
انجمن
Prisma دارای یک جامعه بزرگ و همیشه در حال تکامل از توسعه دهندگان و مشارکت کنندگان مهمان است. همچنین دارای یک مخزن فعال GitHub است که در آن توسعه دهندگان می توانند مشکلات مربوط به کیت ابزار Prisma را ماسکیما کنند و درخواست های ادغام را برای رفع مشکل و ویژگی های جدید ارسال کنند. همچنین کانال های Discord و Slack برای سوالات و پیشنهادات جامعه وجود دارد.
با SQL ساده، توسعه دهندگان اغلب باید به انجمن هایی مانند Stack Overflow یا جوامع آنلاین مانند Reddit تکیه کنند. در همین حال، درست مانند Prisma، سازندگان کوئری SQL معمولاً جوامع توسعه دهنده خود را با کانال هایی برای اهداف ارتباطات و یادگیری دارند.
نتیجه
Prisma ORM یک Node.js و TypeScript ORM با پایگاه داده آگنوستیک نسل بعدی است که هنگام کار با پایگاههای داده، گردش کار آسانتر و سادهتری را در اختیار توسعهدهندگان قرار میدهد. ویژگی هایی مانند مایگرشن خودکار، ایمنی نوع، تجربه توسعه دهنده و تکمیل خودکار را ارائه می دهد.
همانطور که قبلاً بحث شد، عملکرد Prisma عالی است در حالی که دسترسی و مدیریت بهینه به پایگاه داده را نیز ارائه می دهد. همچنین تجربه توسعه دهنده را از طریق مستندات جامع، راهنماها، و جامعه و اکوسیستم عالی خود بهبود می بخشد.
یک اشکال بالقوه Prisma این است که منحنی یادگیری برای توسعه دهندگانی که از نوشتن کوئری های ساده SQL یا استفاده از سازندگان کوئری SQL می توانند شیب دار باشد. با این حال، این جایگزینها معمولاً ویژگیها و سهولت استفاده را که Prisma ارائه میکند، ارائه نمیکنند.
به خاطر داشته باشید که Prisma ممکن است برای پروژه هایی که به شدت به کوئری های SQL متکی هستند یا به کنترل پایگاه داده بیشتری نیاز دارند مناسب نباشد. با این حال، ویژگیهای قدرتمند آن از جمله ایمنی نوع، سهولت یکپارچهسازی، دسترسی و مدیریت پایگاه داده، DX و موارد دیگر به آن برتری نسبت به SQL ساده، سازندگانکوئری SQL یا سایر ORM ها میدهد.
Prisma همچنین تعدادی ویژگی دیگر مانند Prisma Client و Prisma Migrate را ارائه می دهد که آن را برای توسعه وب مدرن بسیار مناسب می کند. من شما را تشویق می کنم که Prisma را امتحان کنید و ویژگی های عالی و DX آن را برای خودتان تجربه کنید. اگر سوالی دارید، در زیر نظر دهید.