ORM کیا ہے؟ ایپس ڈیٹابیس سے کیسے بات کرتی ہیں، آسان وضاحت
ORM (object-relational mapper) ایک کوڈ لائبریری ہے جو ایپ اور ریلیشنل ڈیٹابیس کے درمیان بیٹھتی ہے۔ SQL میں ڈیٹابیس کوئریز لکھنے کے بجائے ڈویلپرز ڈیٹا کے ساتھ اپنی پروگرامنگ زبان کے عام آبجیکٹس کی طرح کام کرتے ہیں، جیسے db.booking.create(...) یا Booking.find(...)۔ ORM اسے SQL میں تبدیل کرتا ہے، چلاتا ہے، اور نتائج واپس آبجیکٹس میں بدل دیتا ہے۔ TypeScript کے لیے Prisma اور Drizzle، Python کے لیے SQLAlchemy، اور C# کے لیے Entity Framework Core مشہور مثالیں ہیں۔
AI سے ایپ بناتے وقت ORMs کیوں اہم ہیں
جب کوئی AI ایپ بلڈر آپ کی ایپ میں ڈیٹابیس شامل کرتا ہے، تو عموماً اس سے بات کرنے کے لیے ایک ORM بھی شامل کرتا ہے۔ ORM کا کوڈ آپ کو خود نہیں لکھنا ہوگا، مگر یہ جاننا مفید ہے کہ وہ موجود ہے:
- آپ کا ڈیٹا ماڈل کوڈ میں رہتا ہے۔ ORM کی اسکیما فائل اکثر آپ کی ایپ کے ڈیٹا کی سب سے واضح وضاحت ہوتی ہے: کون سے ٹیبل موجود ہیں، ہر ایک میں کون سے فیلڈز ہیں، اور وہ آپس میں کیسے جڑے ہیں۔ اسے پڑھ کر جلدی دیکھا جا سکتا ہے کہ AI نے آپ کی ایپ درست سمجھی ہے یا نہیں۔
- ڈیٹابیس میں تبدیلیاں مائیگریشنز کے ذریعے ہوتی ہیں۔ جب آپ کہتے ہیں “customers میں فون نمبر شامل کرو”، تو AI ماڈل اپ ڈیٹ کرتا ہے اور ایک مائیگریشن بناتا ہے۔ یہ جاننا سمجھنے میں مدد دیتا ہے کہ کوئی تبدیلی لائیو کام کرنے سے پہلے کیوں لاگو کرنا پڑ سکتی ہے۔
- ڈیفالٹ کے طور پر محفوظ۔ ORMs کوئریز اس طرح بناتے ہیں کہ SQL injection سے بچاؤ ہو، جو ان ایپس میں سب سے عام سیکیورٹی خامیوں میں سے ایک ہے جو کوئریز ہاتھ سے جوڑتی ہیں۔
- کارکردگی کے جال۔ ORMs آسانی سے ایسی بہت سی چھوٹی کوئریز چلا دیتے ہیں جہاں ایک کافی ہو۔ AI سے بنی ایپس میں سست صفحات کی یہ ایک عام وجہ ہے۔
روزمرہ کی ایک مثال
تصور کریں ایک برطانوی سیاح اور ایک جاپانی دکاندار ہیں جن کی زبان مشترک نہیں، اور وہ ایک مترجم کے ذریعے بات کر رہے ہیں۔
سیاح (آپ کی ایپ) کہتا ہے، “مجھے آپ کی تین سب سے سستی چائے چاہئیں۔” مترجم (ORM) اسے درست جاپانی (SQL) میں بدلتا ہے، دکاندار (ڈیٹابیس) تک پہنچاتا ہے، اور جواب واپس انگریزی میں ترجمہ کر دیتا ہے۔
سیاح کو جاپانی نہیں سیکھنی پڑتی، اور زیادہ تر بات چیت کے لیے یہ ٹھیک ہے۔ مگر کسی پیچیدہ مذاکرات میں براہِ راست بولنا مفید ہو سکتا ہے، اسی لیے زیادہ تر ORMs ڈویلپرز کو ضرورت پر کچا SQL لکھنے دیتے ہیں۔
ORM کیسے کام کرتا ہے
Postgres جیسے ڈیٹابیسز ڈیٹا کو قطاروں اور کالموں والے ٹیبلز میں محفوظ کرتے ہیں اور SQL سے کوئری کیے جاتے ہیں۔ پروگرامنگ زبانیں آبجیکٹس کے ساتھ کام کرتی ہیں: ایک بکنگ جس کی date، customer اور status ہو۔ ORM ان دونوں کے درمیان نقشہ بناتا ہے:
| ڈیٹابیس کی طرف | ORM / کوڈ کی طرف |
|---|---|
ٹیبل bookings | ماڈل Booking |
| قطار (Row) | ایک بکنگ آبجیکٹ |
کالم starts_at | فیلڈ startsAt |
فارن کی customer_id | ریلیشن booking.customer |
SELECT، INSERT، UPDATE، DELETE | طریقے find، create، update، delete |
یہ چار کارروائیاں وہی CRUD ایکشنز ہیں جن پر تقریباً ہر ایپ کھڑی ہوتی ہے۔
ایک عملی مثال: Prisma کے ساتھ بکنگز
یہاں ایک آسان Prisma اسکیما ہے جو سیلون بکنگ ایپ کے لیے ہے۔ یہ دو ٹیبلز اور ان کے تعلق کو بیان کرتا ہے:
model Customer {
id Int @id @default(autoincrement())
name String
email String @unique
bookings Booking[]
}
model Booking {
id Int @id @default(autoincrement())
startsAt DateTime
service String
customer Customer @relation(fields: [customerId], references: [id])
customerId Int
}
سادہ الفاظ میں: ایک کسٹمر کا نام، ایک منفرد ای میل اور کئی بکنگز ہوتی ہیں؛ ہر بکنگ کا آغاز کا وقت، ایک سروس ہوتی ہے اور وہ ایک کسٹمر سے تعلق رکھتی ہے۔
اب ایپ کو چاہیے “لینا کی آنے والی بکنگز، قریب ترین پہلے”:
const bookings = await db.booking.findMany({
where: {
customer: { email: "lena@example.com" },
startsAt: { gte: new Date() },
},
orderBy: { startsAt: "asc" },
});
ORM اسے تقریباً اس SQL میں بدلتا ہے، اسے چلاتا ہے اور بکنگ آبجیکٹس کی فہرست واپس کرتا ہے:
SELECT b.* FROM "Booking" b
JOIN "Customer" c ON c.id = b."customerId"
WHERE c.email = $1 AND b."startsAt" >= $2
ORDER BY b."startsAt" ASC;
$1 اور $2 placeholders ہیں: ای میل اور تاریخ کوئری کے متن سے الگ بھیجی جاتی ہیں، اور یہی SQL injection کو روکتا ہے۔
مائیگریشنز
اگر آپ پھر کہیں “کسٹمرز کو فون نمبر شامل کرنے دو”، تو AI Customer ماڈل میں phone String? شامل کرتا ہے (? کا مطلب ہے کہ فیلڈ اختیاری ہے) اور ایک مائیگریشن بناتا ہے، یعنی ایک چھوٹا SQL اسکرپٹ جیسے ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;۔ مائیگریشنز ترتیب سے محفوظ ہوتی ہیں، تاکہ ڈیٹابیس کی ہر کاپی ایک ہی ساخت پر لائی جا سکے، اور تبدیلیوں کی تاریخ بھی برقرار رہتی ہے۔
زبان کے لحاظ سے عام ORMs
| زبان | عام ORMs |
|---|---|
| TypeScript / JavaScript | Prisma، Drizzle، TypeORM، Sequelize |
| Python | SQLAlchemy، Django ORM، SQLModel |
| C# | Entity Framework Core |
| Java | Hibernate (اکثر Spring Data JPA کے ذریعے) |
| Ruby | Active Record |
ORMs اس حد میں مختلف ہیں کہ وہ SQL کو کتنا چھپاتے ہیں۔ Prisma اپنی اسکیما زبان اور کوئری انداز استعمال کرتا ہے؛ Drizzle جان بوجھ کر SQL کی شکل کے قریب رہتا ہے اور پھر بھی ہر چیز کو ٹائپ شدہ رکھتا ہے۔ Knex یا TypeScript کے لیے Kysely جیسے ہلکے ٹولز، جنہیں query builders کہا جاتا ہے، قطاروں کو مکمل آبجیکٹس میں بدلے بغیر کوڈ میں SQL بنانے میں مدد دیتے ہیں۔
اہم اصطلاحات
| اصطلاح | مطلب |
|---|---|
| ماڈل | ٹیبل اور اس کے فیلڈز کی کوڈ میں تعریف۔ |
| اسکیما | تمام ٹیبلز، فیلڈز اور تعلقات کی مکمل وضاحت۔ |
| ریلیشن | ماڈلز کے درمیان ربط، جیسے کسی کسٹمر سے تعلق رکھنے والی بکنگ۔ |
| مائیگریشن | ایک ورژن شدہ اسکرپٹ جو ڈیٹابیس کی ساخت بدلتا ہے۔ |
| Query builder | ایک ہلکا ٹول جو مکمل آبجیکٹ میپنگ کے بغیر کوڈ میں SQL بناتا ہے۔ |
| N+1 مسئلہ | ایک فہرست کے لیے ایک کوئری، پھر ہر آئٹم کے لیے ایک اور کوئری، جو بڑے پیمانے پر سست ہے۔ |
| Raw SQL | ہاتھ سے لکھا ہوا SQL، جو اس وقت استعمال ہوتا ہے جب ORM رکاوٹ بنے۔ |
عام غلط فہمیاں
- “ORM ایک ڈیٹابیس ہے۔” ایسا نہیں۔ یہ ایک مترجم ہے۔ آپ کو پھر بھی Postgres جیسا ڈیٹابیس چاہیے۔
- “ORM ہو تو اپنے ڈیٹا کو سمجھنے کی ضرورت نہیں۔” غلط ڈیزائن شدہ ٹیبلز ORM کے ذریعے بھی اتنے ہی تکلیف دہ ہوتے ہیں۔ اچھا ڈیٹا ماڈل ٹول سے زیادہ اہم ہے۔
- “ORMs ہمیشہ سست ہوتے ہیں۔” روزمرہ کی کوئریز ٹھیک ہوتی ہیں۔ سستی عموماً N+1 کوئریز یا انڈیکسز کی کمی جیسے انداز سے آتی ہے، جو درست کی جا سکتی ہے۔
- “ORM کا مطلب ہے کہ SQL injection کا خطرہ کبھی نہیں۔” معیاری ORM طریقے محفوظ ہیں، مگر کچا SQL جس میں صارف کا ان پٹ جوڑا گیا ہو، اب بھی خطرناک ہے۔
- “اسکیما فائل میں تبدیلی لائیو ڈیٹابیس کو بدل دیتی ہے۔” صرف اس وقت جب مائیگریشن بنے اور اس ڈیٹابیس پر لاگو ہو۔
اپنے AI بلڈر سے کیا پوچھیں
- “ڈیٹابیس اسکیما دکھاؤ اور ہر ٹیبل اور تعلق کو سادہ اردو یا انگریزی میں سمجھاؤ۔”
- “یہ پروجیکٹ کون سا ORM استعمال کرتا ہے، اور مائیگریشنز کہاں ہیں؟”
- “کسی بھی ٹیبل کو بدلنے سے پہلے بتاؤ کہ موجودہ ڈیٹا پر کیا اثر پڑے گا، اور جس کالم میں ڈیٹا ہو اسے پوچھے بغیر کبھی نہ ہٹاؤ۔”
- “سست ترین صفحات میں N+1 کوئریز چیک کرو، اور جہاں فہرستیں فلٹر یا ترتیب دی جاتی ہیں وہاں انڈیکسز شامل کرو۔”
- “یقینی بناؤ کہ صارف کے ان پٹ والی ہر کوئری ORM کے ذریعے یا پیرامیٹرز کے ساتھ ہو، کوئی SQL جو سٹرنگ جوڑ کر بنایا گیا ہو نہیں۔”
Mythex میں ORMs
جب آپ کی ایپ کو ڈیٹا محفوظ کرنا ہو، Mythex پروجیکٹ میں ایک مخصوص Postgres ڈیٹابیس شامل کرتا ہے۔ چیٹ میں پوچھیں یا /database کمانڈ استعمال کریں، اور اس کی کنیکشن تفصیلات ورک اسپیس اور شائع شدہ ایپ میں ڈالی جاتی ہیں (Database)۔ اس کے بعد ایجنٹ وہ کوڈ لکھتا ہے جو آپ کا ڈیٹا پڑھتا اور محفوظ کرتا ہے۔ اگر آپ کی کوئی ترجیح ہو، جیسے “Prisma استعمال کرو”، “SQLAlchemy استعمال کرو” یا “سادہ SQL، کوئی ORM نہیں”، تو چیٹ میں بتائیں۔ جب بھی ساخت چیک کرنی ہو، اس سے اسکیما سمجھانے کو کہیں؛ آپ کوڈ ایڈیٹر میں فائلیں خود بھی پڑھ سکتے ہیں۔ بڑی تصویر کے لیے ڈیٹابیس کیا ہے اور SQL بمقابلہ NoSQL دیکھیں۔
سوالات
سادہ الفاظ میں ORM کیا ہے؟
ORM (object-relational mapper) ایک کوڈ لائبریری ہے جو ایپ اور ریلیشنل ڈیٹابیس کے درمیان بیٹھتی ہے۔ یہ ڈویلپرز کو ڈیٹا کو اپنی پروگرامنگ زبان میں عام آبجیکٹس کی شکل میں پڑھنے اور محفوظ کرنے دیتی ہے، اور پسِ پردہ SQL کوئریز خود لکھ دیتی ہے۔
ORMs کی کچھ مثالیں کیا ہیں؟
عام ORMs میں TypeScript اور JavaScript کے لیے Prisma اور Drizzle، Python کے لیے SQLAlchemy اور Django ORM، C# کے لیے Entity Framework Core، Java کے لیے Hibernate، اور Ruby on Rails میں Active Record شامل ہیں۔
کیا ORM استعمال کرنا SQL لکھنے سے بہتر ہے؟
یہ کام پر منحصر ہے۔ ORM روزمرہ کے پڑھنے اور لکھنے کے کام جلدی لکھنے، محفوظ رکھنے اور بدلنے میں آسان بناتا ہے، جبکہ ہاتھ سے لکھا ہوا SQL پیچیدہ رپورٹس یا کارکردگی کے لیے اہم کوئریز پر مکمل کنٹرول دیتا ہے۔ زیادہ تر ORMs آپ کو ضرورت پڑنے پر کچا SQL استعمال کرنے کی سہولت دیتے ہیں۔
مائیگریشن کیا ہوتی ہے؟
مائیگریشن ایک چھوٹا، ورژن شدہ اسکرپٹ ہے جو ڈیٹابیس کی ساخت بدلتا ہے، جیسے نیا ٹیبل یا کالم شامل کرنا۔ ORMs آپ کے ڈیٹا ماڈل سے مائیگریشنز بنا سکتے ہیں تاکہ ڈیٹابیس کی ہر کاپی، لیپ ٹاپ پر، ٹیسٹنگ میں اور پروڈکشن میں، ایک ہی ساخت پر ہو۔