Co je ORM? Jak aplikace komunikují s databázemi, vysvětleno
ORM (objektově-relační mapper) je knihovna v kódu, která stojí mezi aplikací a relační databází. Místo psaní databázových dotazů v SQL vývojáři pracují s daty jako s běžnými objekty ve svém programovacím jazyce — db.booking.create(...) nebo Booking.find(...) — a ORM je přeloží do SQL, spustí a výsledky zase převede zpět na objekty. Známé příklady jsou Prisma a Drizzle pro TypeScript, SQLAlchemy pro Python a Entity Framework Core pro C#.
Proč na ORM záleží, když stavíte s AI
Když AI nástroj pro tvorbu aplikací přidá k vaší aplikaci databázi, obvykle přidá i ORM, které s ní komunikuje. ORM kód psát nebudete, ale je dobré vědět, že tam je:
- Datový model žije v kódu. Schématický soubor ORM bývá nejjasnějším popisem dat vaší aplikace: které tabulky existují, jaká pole mají a jak jsou propojeny. Jeho přečtení je rychlý způsob, jak ověřit, že AI vašemu zadání rozuměla.
- Změny databáze procházejí migracemi. Když požádáte o „přidej zákazníkům telefonní číslo", AI upraví model a vytvoří migraci. Díky tomu chápete, proč může být změna před tím, než začne fungovat naživo, potřeba nejprve nasadit.
- Bezpečnost ve výchozím nastavení. ORM sestavuje dotazy způsobem, který chrání před SQL injection, jednou z nejčastějších bezpečnostních děr v aplikacích, které dotazy skládají ručně.
- Past na rychlost. ORM usnadňuje omylem spustit stovky malých dotazů tam, kde by stačil jeden. Je to častá příčina pomalých stránek v aplikacích postavených pomocí AI.
Každodenní přirovnání
Představte si britského cestovatele a japonskou prodavačku, které nemluví stejným jazykem a domlouvají se přes tlumočníka.
Cestovatel (vaše aplikace) řekne: „Chtěl bych tři nejlevnější čaje, které máte." Tlumočník (ORM) to přeloží do přesné japonštiny (SQL), předá prodavačce (databázi) a odpověď přeloží zpět do angličtiny.
Cestovatel se japonsky nenaučí a u většiny rozhovorů je to v pořádku. Při složitém vyjednávání ale může pomoci mluvit přímo — proto většina ORM umožňuje vývojářům v případě potřeby psát surové SQL.
Jak ORM funguje
Databáze jako Postgres ukládají data v tabulkách řádků a sloupců a dotazují se na ně pomocí SQL. Programovací jazyky pracují s objekty: rezervace s datem, zákazníkem a stavem. ORM mapuje jedno na druhé:
| Strana databáze | Strana ORM / kódu |
|---|---|
Tabulka bookings | Model Booking |
| Řádek | Jeden objekt rezervace |
Sloupec starts_at | Pole startsAt |
Cizí klíč customer_id | Vztah booking.customer |
SELECT, INSERT, UPDATE, DELETE | Metody find, create, update, delete |
Těchto čtyř operací se týkají akce CRUD, na nichž je postavena téměř každá aplikace.
Praktický příklad: rezervace s Prisma
Zde je zjednodušené Prisma schéma pro aplikaci na rezervace v salonu. Popisuje dvě tabulky a jejich propojení:
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
}
Prostě řečeno: zákazník má jméno, jedinečný e-mail a mnoho rezervací; každá rezervace má čas začátku, službu a patří jednomu zákazníkovi.
Aplikace teď chce „nadcházející rezervace Leny, od nejbližší":
const bookings = await db.booking.findMany({
where: {
customer: { email: "lena@example.com" },
startsAt: { gte: new Date() },
},
orderBy: { startsAt: "asc" },
});
ORM to přemění na SQL zhruba takto, dotaz spustí a vrátí seznam objektů rezervací:
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 a $2 jsou zástupné symboly: e-mail a datum se posílají odděleně od textu dotazu, a to brání SQL injection.
Migrace
Když pak požádáte: „ať si zákazníci mohou přidat telefonní číslo", AI přidá phone String? do modelu Customer (? znamená volitelné) a vygeneruje migraci — malý SQL skript, například ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;. Migrace se ukládají v pořadí, takže každou kopii databáze lze uvést do stejné struktury, a historie změn se uchovává.
Běžná ORM podle jazyka
| Jazyk | Běžná ORM |
|---|---|
| TypeScript / JavaScript | Prisma, Drizzle, TypeORM, Sequelize |
| Python | SQLAlchemy, Django ORM, SQLModel |
| C# | Entity Framework Core |
| Java | Hibernate (často přes Spring Data JPA) |
| Ruby | Active Record |
ORM se liší tím, jak moc SQL skrývají. Prisma používá vlastní jazyk schématu a styl dotazů; Drizzle záměrně zůstává blízko tvaru SQL a přitom je vše typované. Lehčím nástrojům, kterým se říká query buildery, jako jsou Knex nebo Kysely pro TypeScript, pomáhají sestavovat SQL v kódu, ale řádky nemapují na plné objekty.
Klíčové pojmy
| Pojem | Význam |
|---|---|
| Model | Kódová definice tabulky a jejích polí. |
| Schéma | Úplný popis všech tabulek, polí a vztahů. |
| Vztah | Propojení mezi modely, například rezervace patřící zákazníkovi. |
| Migrace | Verzovaný skript, který mění strukturu databáze. |
| Query builder | Lehčí nástroj pro sestavování SQL v kódu bez plného mapování na objekty. |
| Problém N+1 | Jeden dotaz pro seznam a pak ještě jeden pro každou položku — ve velkém měřítku pomalé. |
| Surové SQL | Ručně psané SQL, použité tam, kde ORM překáží. |
Časté omyly
- „ORM je databáze." Není. Je to překladatel. Pořád potřebujete databázi, například Postgres.
- „S ORM nemusíte rozumět svým datům." Špatně navržené tabulky bolí i přes ORM. Dobrý datový model je důležitější než nástroj.
- „ORM je vždy pomalé." Běžné dotazy jsou v pořádku. Pomalost obvykle způsobují vzory jako dotazy N+1 nebo chybějící indexy, a ty se dají opravit.
- „ORM znamená, že SQL injection nehrozí nikdy." Standardní metody ORM jsou bezpečné, ale surové SQL, do něhož se vkládá vstup od uživatele, je pořád nebezpečné.
- „Úprava souboru schématu změní živou databázi." Jen pokud je vytvořena migrace a aplikována na danou databázi.
Na co se zeptat svého AI nástroje
- „Ukaž mi databázové schéma a vysvětli každou tabulku a vztah srozumitelně."
- „Které ORM tento projekt používá a kde jsou migrace?"
- „Než změníš jakoukoli tabulku, řekni mi, zda budou ovlivněna existující data, a nikdy bez dotazu neodstraňuj sloupec, který obsahuje data."
- „Zkontroluj nejpomalejší stránky na dotazy N+1 a tam, kde se seznamy filtrují nebo řadí, přidej indexy."
- „Zajisti, aby každý dotaz, který používá vstup od uživatele, šel přes ORM nebo používal parametry — žádné SQL skládané z řetězců."
ORM v Mythexu
Když vaše aplikace potřebuje ukládat data, Mythex k projektu přidá vyhrazenou databázi Postgres — zeptejte se v chatu nebo použijte příkaz /database — a její připojovací údaje vloží do pracovního prostoru i publikované aplikace (Database). Agent pak napíše kód, který vaše data čte a ukládá. Pokud máte preferenci — „použij Prisma", „použij SQLAlchemy" nebo „čisté SQL, bez ORM" — řekněte to v chatu. Kdykoli chcete schéma projít, požádejte agenta, aby vám ho vysvětlil; soubory můžete číst v editoru kódu. Širší souvislosti najdete v článcích co je databáze a SQL vs NoSQL.
Otázky
Co je to ORM jednoduše řečeno?
ORM (objektově-relační mapper) je knihovna v kódu, která stojí mezi vaší aplikací a relační databází. Umožňuje vývojářům číst a ukládat data jako běžné objekty ve svém programovacím jazyce a SQL dotazy za nimi píše na pozadí.
Jaké jsou příklady ORM?
Mezi běžná ORM patří Prisma a Drizzle pro TypeScript a JavaScript, SQLAlchemy a Django ORM pro Python, Entity Framework Core pro C#, Hibernate pro Javu a Active Record v Ruby on Rails.
Je ORM lepší než psaní SQL?
Záleží na úkolu. ORM usnadňuje psaní běžných čtení a zápisů, jsou bezpečnější a snáze se mění, zatímco ručně psané SQL dává plnou kontrolu u složitých reportů nebo dotazů citlivých na výkon. Většina ORM vám umožní sáhnout po surovém SQL, když ho potřebujete.
Co je migrace?
Migrace je malý, verzovaný skript, který mění strukturu databáze, například přidá tabulku nebo sloupec. ORM dokážou migrace vygenerovat z datového modelu, takže každá kopie databáze — na notebooku, při testování i v produkci — skončí se stejnou strukturou.