Što je ORM? Kako aplikacije komuniciraju s bazama podataka, objašnjeno
ORM (object-relational mapper) je programska biblioteka koja se nalazi između aplikacije i relacijske baze podataka. Umjesto pisanja upita u SQL-u, programeri rade s podacima kao s običnim objektima u svom programskom jeziku — db.booking.create(...) ili Booking.find(...) — a ORM to prevodi u SQL, izvršava ga i rezultate pretvara natrag u objekte. Poznati primjeri su Prisma i Drizzle za TypeScript, SQLAlchemy za Python i Entity Framework Core za C#.
Zašto su ORM-ovi važni kad gradite uz AI
Kada AI alat za izradu aplikacija vašoj aplikaciji doda bazu podataka, obično uz nju dodaje i ORM kako bi mogao s njom komunicirati. ORM kod nećete morati sami pisati, ali korisno je znati da postoji:
- Vaš model podataka živi u kodu. Datoteka sheme ORM-a često je najjasniji opis podataka vaše aplikacije: koje tablice postoje, koja polja ima svaka i kako su povezane. Brz je način da provjerite je li AI dobro razumio vašu aplikaciju.
- Promjene baze idu kroz migracije. Kada zatražite „dodaj broj telefona kupcima”, AI ažurira model i stvara migraciju. Razumijevanje toga pomaže shvatiti zašto neka promjena može trebati primjenu prije nego što počne raditi uživo.
- Sigurnost po defaultu. ORM-ovi grade upite tako da štite od SQL injekcije, jedne od najčešćih sigurnosnih rupa u aplikacijama koje upite sastavljaju ručno.
- Zamke brzine. ORM-ovi olakšavaju slučajno pokretanje stotina malih upita umjesto jednog. To je čest razlog sporih stranica u aplikacijama izrađenim uz AI.
Svakodnevna analogija
Zamislite britanskog putnika i japanskog trgovca koji ne govore isti jezik pa se sporazumijevaju preko tumača.
Putnik (vaša aplikacija) kaže: „Želim tri najjeftinija čaja koja imate.” Tumač (ORM) to prevodi na precizan japanski (SQL), prosljeđuje trgovcu (bazi podataka), a odgovor prevodi natrag na engleski.
Putnik nikad ne mora naučiti japanski, i za većinu razgovora to je u redu. Ali za složeno pregovaranje korisno je govoriti izravno — zato većina ORM-ova programerima dopušta da po potrebi napišu sirovi SQL.
Kako ORM radi
Baze poput Postgresa podatke pohranjuju u tablicama redaka i stupaca, a upituju se pomoću SQL-a. Programski jezici rade s objektima: rezervacija s datumom, kupcem i statusom. ORM jedno povezuje s drugim:
| Strana baze | Strana ORM-a / koda |
|---|---|
Tablica bookings | Model Booking |
| Redak | Jedan objekt rezervacije |
Stupac starts_at | Polje startsAt |
Strani ključ customer_id | Relacija booking.customer |
SELECT, INSERT, UPDATE, DELETE | Metode find, create, update, delete |
Te četiri operacije su CRUD radnje na kojima se gradi gotovo svaka aplikacija.
Primjer: rezervacije s Prismom
Evo pojednostavljene Prisma sheme za aplikaciju za rezervacije u salonu. Opisuje dvije tablice i način na koji su povezane:
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
}
Jednostavnim riječima: kupac ima ime, jedinstvenu e-adresu i mnogo rezervacija; svaka rezervacija ima početak, uslugu i pripada jednom kupcu.
Sada aplikacija želi „nadolazeće rezervacije od Lene, najranije prve”:
const bookings = await db.booking.findMany({
where: {
customer: { email: "lena@example.com" },
startsAt: { gte: new Date() },
},
orderBy: { startsAt: "asc" },
});
ORM to otprilike ovako pretvara u SQL, izvršava ga i vraća popis objekata rezervacija:
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 i $2 su mjesta za vrijednosti: e-adresa i datum šalju se odvojeno od teksta upita, a upravo to sprječava SQL injekciju.
Migracije
Ako zatim zatražite „neka kupci mogu dodati broj telefona”, AI modelu Customer dodaje phone String? (oznaka ? znači da je polje neobavezno) i generira migraciju — kratku SQL skriptu poput ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;. Migracije se spremaju redom, pa se svaka kopija baze može dovesti na istu strukturu, a povijest promjena ostaje sačuvana.
Uobičajeni ORM-ovi po jeziku
| Jezik | Uobičajeni ORM-ovi |
|---|---|
| TypeScript / JavaScript | Prisma, Drizzle, TypeORM, Sequelize |
| Python | SQLAlchemy, Django ORM, SQLModel |
| C# | Entity Framework Core |
| Java | Hibernate (često preko Spring Data JPA) |
| Ruby | Active Record |
ORM-ovi se razlikuju po tome koliko skrivaju SQL. Prisma koristi vlastiti jezik za sheme i stil upita; Drizzle namjerno ostaje blizu oblika SQL-a, a pritom zadržava tipove. Lakši alati zvani query builderi, poput Knexa ili Kyselyja za TypeScript, pomažu graditi SQL u kodu bez mapiranja redaka u pune objekte.
Ključni pojmovi
| Pojam | Značenje |
|---|---|
| Model | Kodna definicija tablice i njezinih polja. |
| Shema | Potpuni opis svih tablica, polja i veza. |
| Relacija | Veza između modela, primjerice rezervacija koja pripada kupcu. |
| Migracija | Verzionirana skripta koja mijenja strukturu baze. |
| Query builder | Lakši alat za gradnju SQL-a u kodu bez punog objektnog mapiranja. |
| Problem N+1 | Jedan upit za popis, pa po jedan za svaku stavku — sporo pri većem obimu. |
| Sirovi SQL | SQL napisan ručno, koristi se kad ORM smeta. |
Česte zablude
- „ORM je baza podataka.” Nije. To je prevoditelj. I dalje vam treba baza poput Postgresa.
- „S ORM-om ne moraš razumjeti svoje podatke.” Loše osmišljene tablice jednako muče i kroz ORM. Dobar model podataka važniji je od alata.
- „ORM-ovi su uvijek spori.” Uobičajeni upiti su brzi. Sporost obično dolazi od obrazaca poput N+1 upita ili nedostajućih indeksa, a to se može popraviti.
- „ORM znači da nema rizika od SQL injekcije, nikad.” Standardne ORM metode su sigurne, ali sirovi SQL u koji se lijepi korisnički unos i dalje je opasan.
- „Uređivanje datoteke sheme mijenja živu bazu.” Tek kad se napravi migracija i primijeni na tu bazu.
Što pitati svog AI alata za izradu
- „Pokaži mi shemu baze i objasni svaku tablicu i vezu jednostavnim jezikom.”
- „Koji ORM koristi ovaj projekt i gdje se nalaze migracije?”
- „Prije nego što promijeniš bilo koju tablicu, reci mi hoće li to utjecati na postojeće podatke i nikad ne briši stupac koji ima podatke bez pitanja.”
- „Provjeri najsporije stranice zbog N+1 upita i dodaj indekse tamo gdje se liste filtriraju ili sortiraju.”
- „Pobrini se da svaki upit koji koristi korisnički unos ide kroz ORM ili koristi parametre — bez SQL-a sastavljenog lijepljenjem teksta.”
ORM-ovi u Mythexu
Kada vaša aplikacija treba spremati podatke, Mythex u projekt dodaje namjensku Postgres bazu — zatražite je u chatu ili koristite naredbu /database — i njezine podatke za povezivanje ubacuje u radni prostor i objavljenu aplikaciju (Baza podataka). Agent zatim piše kod koji čita i sprema vaše podatke. Ako imate preferenciju — „koristi Prisma”, „koristi SQLAlchemy” ili „običan SQL, bez ORM-a” — recite to u chatu. Zamolite ga da vam objasni shemu kad god želite provjeriti strukturu; datoteke možete pročitati u uređivaču koda. Za širu sliku pogledajte što je baza podataka i SQL vs NoSQL.
Pitanja
Što je ORM jednostavnim riječima?
ORM (object-relational mapper) je programska biblioteka koja se nalazi između vaše aplikacije i relacijske baze podataka. Programerima omogućuje da podatke čitaju i spremaju kao obične objekte u svom programskom jeziku, a SQL upite u pozadini piše sama.
Koji su primjeri ORM-ova?
Uobičajeni ORM-ovi su Prisma i Drizzle za TypeScript i JavaScript, SQLAlchemy i Django ORM za Python, Entity Framework Core za C#, Hibernate za Javu te Active Record u Ruby on Railsu.
Je li ORM bolji od pisanja SQL-a?
Ovisi o zadatku. ORM svakodnevno čitanje i pisanje čini brzim za pisanje, sigurnijim i lakšim za promjenu, dok ručno napisan SQL daje punu kontrolu za složene izvještaje ili upite osjetljive na performanse. Većina ORM-ova omogućuje da po potrebi siđete na sirovi SQL.
Što je migracija?
Migracija je mala, verzionirana skripta koja mijenja strukturu baze, primjerice dodavanjem tablice ili stupca. ORM-ovi mogu generirati migracije iz vašeg modela podataka, tako da svaka kopija baze — na laptopu, u testiranju i u produkciji — ima istu strukturu.