Bosh sahifa Wiki ORM

ORM

ORMdasturlash tili obyektlari orqali database bilan ishlashga yordam beradigan dasturiy qatlam. ORM inglizcha Object-Relational Mapping so‘zlarining qisqartmasi bo‘lib, obyektlar va relational database jadvallari o‘rtasida bog‘lanish yaratadi.

ORM yordamida dasturchi SQL query yozmasdan, model, obyekt va metodlar orqali ma’lumot qo‘shish, o‘qish, yangilash va o‘chirish amallarini bajarishi mumkin.

Vazifasi

ORM dastur kodi va database o‘rtasidagi aloqani soddalashtiradi.

ORM quyidagi vazifalarda ishlatiladi:

  • database jadvallarini model sifatida ifodalash;
  • yangi ma’lumot qo‘shish;
  • mavjud ma’lumotni o‘qish;
  • ma’lumotni yangilash;
  • ma’lumotni o‘chirish;
  • jadvallar orasidagi relationlarni boshqarish;
  • filter, sort va pagination qilish;
  • migration yaratish;
  • transaction bilan ishlash;
  • SQL querylarni dastur kodi orqali hosil qilish.

Masalan, users jadvali dastur ichida User modeli sifatida ifodalanishi mumkin.

ORM qanday ishlaydi?

ORM dasturdagi model klasslarini database jadvali bilan bog‘laydi. Modeldagi maydonlar database jadvalidagi ustunlarga mos keladi.

Oddiy jarayon:

  • dasturchi model yaratadi;
  • ORM model asosida database jadvali bilan bog‘lanadi;
  • dastur model obyektlari orqali ma’lumot bilan ishlaydi;
  • ORM bu amallarni SQL queryga aylantiradi;
  • database queryni bajaradi;
  • natija yana obyekt ko‘rinishida dasturga qaytariladi.

Masalan, dasturda User.objects.get(id=1) yozilganda, ORM database’da id = 1 bo‘lgan foydalanuvchini topish uchun SQL query hosil qiladi.

Model

Modeldatabase jadvalining dastur kodidagi ifodasi. Model ichida jadval ustunlari, ma’lumot turlari, relationlar va qo‘shimcha qoidalar belgilanadi.

Model odatda quyidagilarni o‘z ichiga oladi:

  • jadval nomi;
  • ustunlar;
  • ma’lumot turlari;
  • default qiymatlar;
  • unique cheklovlar;
  • foreign key bog‘lanishlar;
  • validation qoidalari;
  • model metodlari.

Masalan, Product modeli mahsulot nomi, narxi, tavsifi, kategoriyasi va yaratilgan sanasini saqlashi mumkin.

Obyekt va jadval bog‘lanishi

ORM’da jadvaldagi bitta qator dastur ichida bitta obyekt sifatida ko‘rinadi.

Masalan, users jadvalidagi bitta foydalanuvchi quyidagicha obyekt sifatida ishlatilishi mumkin:

user.name

user.email

user.is_active

Bu yondashuv orqali dasturchi database qatorlari bilan oddiy dastur obyektlari kabi ishlaydi.

CRUD amallari

ORM ko‘pincha CRUD amallarini bajarishda ishlatiladi. CRUD ma’lumotlar bilan ishlashdagi asosiy to‘rt amalni bildiradi.

CRUD amallari:

  • Create — yangi yozuv yaratish;
  • Read — ma’lumot o‘qish;
  • Update — mavjud yozuvni yangilash;
  • Delete — yozuvni o‘chirish.

Masalan, yangi foydalanuvchi yaratish, foydalanuvchini ID orqali topish, profilni yangilash yoki kommentni o‘chirish ORM orqali bajarilishi mumkin.

QuerySet

Ko‘p ORM tizimlarida query natijalari maxsus obyekt yoki ro‘yxat sifatida qaytariladi. Django ORM’da bu tushuncha QuerySet deb ataladi.

QuerySet quyidagilarni bajarishga yordam beradi:

  • filterlash;
  • sort qilish;
  • limit qo‘yish;
  • relationlar bilan ishlash;
  • ma’lumotlarni kechiktirib yuklash;
  • querylarni zanjir ko‘rinishida yozish.

Masalan, faqat faol foydalanuvchilarni olish uchun ORM filter metodidan foydalanishi mumkin.

Filter

ORM’da filter ma’lum shartga mos yozuvlarni olish uchun ishlatiladi.

Filterlash quyidagi maydonlar bo‘yicha bajarilishi mumkin:

  • ID;
  • email;
  • username;
  • status;
  • category;
  • sana;
  • narx;
  • role;
  • foreign key.

Masalan, faqat active holatdagi foydalanuvchilar yoki ma’lum kategoriyadagi mahsulotlar ORM orqali filterlanadi.

Relation

ORM database jadvallari orasidagi bog‘lanishlarni model darajasida ifodalaydi.

Asosiy relation turlari:

  • One-to-one — bitta yozuv boshqa bitta yozuv bilan bog‘lanadi;
  • One-to-many — bitta yozuv ko‘plab yozuvlar bilan bog‘lanadi;
  • Many-to-many — ko‘plab yozuvlar boshqa ko‘plab yozuvlar bilan bog‘lanadi.

Masalan, bitta foydalanuvchining ko‘plab maqolalari bo‘lishi mumkin. Bu one-to-many relation hisoblanadi.

Foreign key

ORM’da foreign key bir modelni boshqa model bilan bog‘lash uchun ishlatiladi.

Masalan:

  • Article modeli User modeli bilan bog‘lanadi;
  • Product modeli Category modeli bilan bog‘lanadi;
  • Order modeli Customer modeli bilan bog‘lanadi;
  • Comment modeli Post modeli bilan bog‘lanadi.

ORM bu bog‘lanishlar asosida kerakli SQL JOIN querylarini hosil qilishi mumkin.

Migration

Migrationdatabase tuzilmasidagi o‘zgarishlarni boshqarish mexanizmi. ORM modeldagi o‘zgarishlar asosida migration fayllarini yaratishi mumkin.

Migration orqali quyidagilar bajariladi:

  • yangi jadval yaratish;
  • ustun qo‘shish;
  • ustun nomini o‘zgartirish;
  • ustun turini almashtirish;
  • jadvalni o‘chirish;
  • index qo‘shish;
  • constraint yaratish;
  • foreign key qo‘shish.

Masalan, User modeliga phone maydoni qo‘shilsa, migration orqali database jadvaliga ham phone ustuni qo‘shiladi.

Lazy loading

Lazy loading — bog‘liq ma’lumotlarni faqat kerak bo‘lganda yuklash usuli. ORM relationdagi ma’lumotni darhol emas, murojaat qilinganda database’dan olishi mumkin.

Masalan, article.author qiymatiga murojaat qilinganda, ORM muallif ma’lumotini alohida query orqali yuklashi mumkin.

Lazy loading quyidagi holatlarda uchraydi:

  • foreign key relation;
  • many-to-many relation;
  • bog‘liq obyektlar;
  • katta ro‘yxatlar;
  • kechiktirilgan querylar.

Eager loading

Eager loading — bog‘liq ma’lumotlarni asosiy query bilan birga oldindan yuklash usuli. Bu relationlar bilan ishlaganda querylar sonini kamaytirish uchun ishlatiladi.

Eager loading quyidagi holatlarda ishlatiladi:

  • maqola va muallifni birga olish;
  • mahsulot va kategoriyani birga olish;
  • buyurtma va buyurtma mahsulotlarini birga olish;
  • komment va foydalanuvchini birga olish.

ORM’da bu yondashuv ko‘pincha select_related, prefetch_related, include yoki shunga o‘xshash metodlar orqali bajariladi.

N+1 muammo

N+1 muammo — ORM relationlar bilan ishlaganda juda ko‘p query bajarilib ketadigan holat. Masalan, 100 ta maqola olinib, har bir maqola uchun muallif alohida query bilan yuklansa, jami 101 ta query bajarilishi mumkin.

N+1 holati quyidagi joylarda uchraydi:

  • ro‘yxat sahifalari;
  • relationlar bilan ishlash;
  • admin panel;
  • API ro‘yxat javoblari;
  • nested serializerlar;
  • template ichidagi relation chaqiriqlari.

Bu muammo ORM relationlarni qanday yuklashiga bog‘liq.

Transaction

ORM transaction bilan ishlash imkonini beradi. Transaction bir nechta database amalini bitta yaxlit jarayon sifatida bajaradi.

Transaction quyidagi holatlarda ishlatiladi:

  • buyurtma yaratish;
  • to‘lovni qayta ishlash;
  • balansni yangilash;
  • bir nechta jadvalga yozish;
  • bog‘liq ma’lumotlarni bir vaqtda o‘zgartirish.

Agar transaction ichidagi amallardan biri xato bo‘lsa, o‘zgarishlar bekor qilinishi mumkin.

Raw SQL

ORM SQL querylarni avtomatik yaratadi, lekin ayrim hollarda raw SQL yozish imkonini ham beradi.

Raw SQL quyidagi holatlarda ishlatilishi mumkin:

  • murakkab querylar;
  • maxsus database funksiyalari;
  • performance optimizatsiya;
  • analytics querylar;
  • ORM qo‘llamaydigan imkoniyatlar;
  • legacy database bilan ishlash.

Raw SQL bevosita database tili bilan ishlaydi, ORM esa obyektlar orqali soddalashtirilgan qatlam beradi.

Mashhur ORM vositalari

Turli dasturlash tillarida turli ORM vositalari mavjud.

Mashhur ORM vositalari:

Har bir ORM o‘z sintaksisi, modeli va database bilan ishlash uslubiga ega.

Backenddagi o‘rni

ORM backend ilovalarda database bilan ishlashning asosiy vositalaridan biri hisoblanadi.

Backend’da ORM quyidagi joylarda ishlatiladi:

Masalan, Django loyihasida model yaratilgandan keyin ORM orqali foydalanuvchi, maqola, kategoriya va boshqa jadvallar bilan ishlash mumkin.

Bog‘liq tushunchalar

Database, SQL, PostgreSQL, MySQL, Model, Migration, Query, Table, Foreign key, Transaction, Backend, API