محمدرضا دیده خانی
محمدرضا دیده خانی
خواندن ۸ دقیقه·۳ سال پیش

آشنایی با ORM ها با Prisma.io !

تکنولوژی ORM چیست و چگونه کار میکند؟

احتمالا براتون پیش اومده که ایده ای قوی داشته باشید و برای پیاده سازیش به اپلیکیشن نیاز داشته باشید. برای ساختن و توسعه یک برنامه ایده آل باید به قابلیت نگهداری آن، ارتقاء پذیری و بهبود عملکرد کلی با استفاده از تکنولوژی های جدید به مرور زمان نیز فکر کرد.

این عوامل ضروری برای مدت طولانی برنامه را پایدار نگه میدارند و به کسب و کار ها اجازه میدهند که به نتایج خوب برسند. یکی از این عوامل که میتواند باعث سریع تر شدن روند توسعه نرم افزار شود، استفاده از ابزار های ORM هست.

برای درک بهتر این مطلب شما به این مهارت ها نیاز خواهید داشت:

  • آشنایی با VsCode
  • آشنایی با زبان های JavaScript و TypeScript
  • دانش خیلی سطحی در رابطه با Database ها
  • آشنایی با Node.Js

مبحث Object-relational Mapping (ORM) چیست؟

به زبان ساده، Object-relational mapping (ORM) یک لایه هست که اطلاعات رو بین Database و Object-oriented entities با استفاده از برنامه نویسی شیء گرا (OOP) به همدیگه تبدیل میکنه.

Object Relational mapping
Object Relational mapping

ابزار زیادی برای ORM در بازار موجود هست، و ما امروز از یکی از آنها به نام Prisma.io استفاده میکنیم.


آماده سازی محیط ها برای شروع کار!

مهم ترین قسمت برنامه نویس بودن JavaScript این هست که Node.Js رو نصب داشته باشید رو سیستمتون ?

اگر Node.Js رو نصب ندارید با استفاده از این لینک به سایتش برید و حتما ورژن Long Term Support (LTS) رو دانلود کنید.

How to download nodejs
How to download nodejs



حالا بریم سراغ نصب PostgreSQL، چیزی که قراره به عنوان Database ازش استفاده کنیم.

از این لینک ورژن مربوط به سیستمتون رو انتخاب کنید و نصب کنید.

بعد از نصب برنامه pgAdmin رو بیارید بالا که سرور دیتابیس رو اماده کنیم.

(تو این برنامه باید یه پسورد درست کنید اولش، خیلی جاها این پسورد رو میخواد از شما، یادتون بمونتش حتما)

مرحله 1: روی Servers راست کلیک کنید، Create رو بزنید و روی Server بزنید.

step 1
step 1

مرحله 2: Name رو دلخواه میتونید بزارید، من گذاشتم Virgool.

step 2
step 2

مرحله 3: از بالای این قسمت برید توی Connection و Host name/address رو بزارید localhost، فیلد password هم باید پسوردی که اول برنامه وارد کردید رو بزنید. لازم نیست چیز دیگه ای عوض شه.

step 3
step 3

دیتابیس ساخته شد و بعدا ازش استفاده میکنیم توی کُدمون.

step 4
step 4



نوشت کد و وصل کردن Database و Prisma !

برای این پروژه ما از VsCode استفاده میکنیم همونطور که بالاتر گفتیم، اگر نمیدونید چی هست میتونید از اینجا دانلود و نصبش کنید، آموزش استفاده ازش هم خیلی زیاد هست توی اینترنت.

یک فولدر درست کنید و VsCode رو ازونجا اجرا کنید.

vscode
vscode

توی این صفحه دکمه های Ctrl + shift + C رو بزنید که cmd باز بشه.

cmd
cmd

حالا دستورات لازم به شروع پروژه رو وارد میکنیم که کد زدن رو شروع کنیم!

مرحله 1: دستور زیر رو وارد میکنیم تا پروژمون توسط Node package manager (npm) درست شه.

npm init -y

مرحله 2: دستور زیر رو وارد میکنیم تا پکیج هایی که لازم داریم نصب شن، همراه با Prisma و TypeScript.

npm install prisma typescript ts-node @types/node --save-dev
  • مرحله 3: یک فایل با اسم tsconfig.json درست میکنیم و کد زیر رو توش مینویسیم.
{ &quotcompilerOptions&quot: { &quotsourceMap&quot: true, &quotoutDir&quot: &quotdist&quot, &quotstrict&quot: true, &quotlib&quot: [&quotesnext&quot], &quotesModuleInterop&quot: true } }
tsconfig
tsconfig

مرحله 4: با استفاده از دستور زیر Prisma CLI (command line interface) رو راه میندازیم.

npx prisma

مرحله 5: دستور زیر 2 کار رو برای ما انجام میده:

  • یک فولدر جدید با نام prisma درست میکنه که یه فایل با اسم schema.prisma توش هست، این فایل مدل های دیتابیس و طریقه وصل شدن به دیتابیس رو معرفی میکنه.
  • فایل .env رو درست میکنه که برای تعریف کردن متغیر های محیط استفاده میشه. (مثلا کانکشن دیتابیس)
npx prisma init



بریم سراغ وصل کردن دیتابیس و به پروژمون!

برای اینکار باید DATABASE_URL داخل فایل .env رو عوض کنیم و جایگزینش کنیم با آدرس دیتابیسی که ساختیم.

.env
.env

بریم ببینیم این قسمتای قرمز چی میگن:

  • قسمت 1: فقط نشون دهنده اینه که داریم از PostgreSQL استفاده میکنیم، نیازی نیست عوض شه.
  • قسمت 2: این قسمت باید عوض شه با username که انتخاب کردید توی pgAdmin.
  • قسمت 3: قسمت هم باید با پسوردتون توی pgAdmin عوض شه.
  • قسمت 4: قسمت Host name/address سرورتون هست.
  • قسمت 5: پورت سرورتون هست.
  • قسمت 6: این قسمت رو با Virgool جایگزین کنید که دیتابیس با این اسم درست شه توی pgAdmin.

قالب این url هم به این شکل هست:

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA



استفاده از Prisma Migrate.

با استفاده از قابلیت Migrate میتونیم مدل هایی که مینویسیم رو از لایه ORM به دیتابیس تبدیل کنیم.
اول بریم سراغ نوشتن مدل هامون.
برای اینکار به فولدر Prisma توی پروژمون میریم و وارد schema.prisma میشیم و این کد رو مینویسیم:

model Scores { id        Int @id @default(autoincrement()) createdAt DateTime @default(now()) score     Int lesson String user      User @relation(fields: [userId], references: [id]) userId    Int } model User { id      Int @id @default(autoincrement()) email   String @unique name    String age    Int? Scores Scores[] }

که نهایتا فایل ما به این شکل خواهد رسید:

schema.prisma
schema.prisma

خب بریم سراغ اینکه کدی که نوشتیم چی هست و چیکار میکنه؟

  • با استفاده از model یک مدل رو تعریف میکنیم که اسم مدل کلمه ای هست که بعد از model میاد، مثلا Scores یا User.
  • داخل مدل قالب به این صورت هست NAME TYPE MODIFIERS. بعنون مثال id داخل مدل user، اولین چیز id هست که name هست، دومی تایپ اون دیتایی هست که قراره ذخیره شه هست که اینجا Integer هست که با Int نشون دادیم. سومین مورد که اکثرا طولانی ترین و مهمترین قسمت هست Modifiers هست که برای id، مودیفایر @id و @default رو داریم. @id کارش این هست که مشخص کنه توی دیتابیس این row رو بعنوان id بشناسه، و @default هم کارش اینه که حتی اگه دیتا داده نشه بهش اون مقداری که داخلش هست رو به عنوان دیتای default انتخاب میکنه، تو این مورد بهش autoIncrement() دادیم که این فانکشن رو خود prisma ساپورت میکنه و کارش این هست که بصورت اتوماتیک اون عدد id رو به تعداد دفعه هایی که دیتا ساخته میشه زیاد میکنه.

تمام این Modifier ها رو میتونید تو اینجا ببینید.

خب حالا بریم سراغ تبدیل کردن این مدل ها از OOP به دیتابیس.

برای اینکار بعد از نوشتن مدل ها این دستور رو وارد میکنیم:

npx prisma migrate dev --name init

کاری که این دستور انجام میده:

  • یه فایل SQL Migration جدید درست میکنه.
  • از این فایل Migration استفاده میکنه تا مدل هارو توی دیتابیس درست/آپدیت کنه

میتونید بعد از اینکار pgAdmin رو رفرش کنید و تغییراتی که انجام دادیم رو ببینید!


نصب کردن کلاینت Prisma.

برای استفاده از قابلیت های کامل Prisma باید پکیج کلاینتش رو نصب کنیم، که با این دستور اون کار رو انجام میدیم:

npm install @prisma/client

کار هایی که این دستور انجام میده رو با عکس زیر توضیح میدم:

prisma client
prisma client

مرحله 1: پکیج داخل node_modules نصب میشه.
مرحله 2: اتوماتیک دستور prisma generate اجرا میشه.
مرحله 3: پکیجی که نصب کردیم (Prisma CLI) از داخل فایل schema.prisma مدل هایی که نوشته شده رو میخونه.
مرحله 4: وقتی مدل هارو خوند اونارو برمیگردونه به کلاینت prisma که بتونیم توی کد ازشون استفاده کنیم.
مرحله 5: این مدل های آپدیت شده رو به پکیج برمیگردونه که اونجا نگه داری شن. (در صورتی که فایل schema.prisma مشکلی براش پیش اومد فایل های ما خراب نشن)

**این نکته رو حتما یادتون نره که فقط ایندفعه خودش برامون دستور prisma generate رو میزنه و اگر دفعه های بعدی schema.prisma رو عوض کردیم حتما باید دستور رو خودمون وارد کنیم که تغییرات به API کلاینت برسه و آپدیت شه!


کوئری کردن دیتابیس و کار کردن با Prisma Client.

حالا که کلاینت آمادس بریم سراغ نوشتن کد برای read و write کردن توی دیتابیس.

برای اینکار من توی پروژه کد رو بصورت Node.js خالی مینویسم که قابلیت های ابتدایی prisma رو بهتون نشون بدم و آشناتون کنم با این تکنولوژی.

برای شروع یک فایل به نام index.ts داخل پروژه درست کنید و کد های زیر رو توش بنویسید:

import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() async function main() { // query haro in dakhel minevisim } main() .catch((e) => { throw e }) .finally(async () => { await prisma.$disconnect() })

اگه این کد رو اجرا کنیم هیچ اتفاقی نمیوفته، چون هنوز کوئری به دیتابیس نزدیم.

برای نوشتن کوئری ها، کد هارو توی main() مینویسیم، این کد رو مینویسیم:

const allUsers = await prisma.user.findMany() console.log(allUsers)

که تابع main به این شکل در میاد:

main
main

حالا برای اجرای کد، این دستور رو وارد میکنیم:

npx ts-node index.ts

وقتی دستور اجرا شه میبینیم که توی کنسول فقط به ما یه لیست خالی میده، که منطقی هم هست چون هنوز هیچ دیتایی ندادیم بهش، پس بریم که یکم اطلاعات بریزیم و دیتابیس!

نوشتن اطلاعات روی دیتابیس.

داخل تابع main این کد هارو جایگزین میکنیم:

await prisma.user.create({data: {name: &quotMohammad reza&quot,email: &quotmohammad@gmail.com&quot,age: 20,Scores: {create: {lesson: &quotcomputer&quot,score: 90,}}}}) const allUsers = await prisma.user.findMany({include: {Scores: true}}) console.dir(allUsers, {depth: null})

که تابعمون نهایتا به این شکل در میاد:

create
create

بعد از ذخیره و اجرای این کد ها، چیزی که در کنسول میبینیم به این شکل هست:

console
console

تا الان تونستیم عمل های read و write رو آشنا شیم باهاشون و انجامشون بدیم، آخرین چیزی که میمونه update هست، پس بریم سراغش.

آپدیت کردن اطلاعات در دیتابیس.

داخل تابع main این کد هارو جایگزین میکنیم:

const score = await prisma.scores.update({where: {id: 1},data: {score: 100}}) console.log(score);

که تابعمون نهایتا به این شکل در میاد:

update
update

بعد از ذخیره و اجرای این کد ها، چیزی که در کنسول میبینیم به این شکل هست:

console
console

و میبینیم که نمره درس از 90 به 100 تغییر کرد.



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




نویسنده: محمدرضا دیده خانی

استاد ناظر: دکتر مریم حاجی اسمعیلی. دکترای علوم کامپیوتر از دانشگاه کینگستون لندن

programmingbackenddatabasenodejsjavascript
شاید از این پست‌ها خوشتان بیاید