Hvað er ORM? Hvernig forrit tala við gagnagrunna, útskýrt
ORM (object-relational mapper) er forritasafn sem situr á milli forrits og tengds gagnagrunns. Í stað þess að skrifa gagnagrunnsfyrirspurnir í SQL vinna forritarar með gögn sem venjulega hluti í forritunarmálinu, til dæmis db.booking.create(...) eða Booking.find(...). ORM þýðir það síðan yfir í SQL, keyrir það og breytir niðurstöðunum aftur í hluti. Þekkt dæmi eru Prisma og Drizzle fyrir TypeScript, SQLAlchemy fyrir Python og Entity Framework Core fyrir C#.
Af hverju ORM skiptir máli þegar þú byggir með gervigreind
Þegar gervigreindarsmiður bætir gagnagrunni við forritið þitt bætir hann yfirleitt líka við ORM til að tala við hann. Þú þarft ekki að skrifa ORM-kóða sjálfur, en gott er að vita af því:
- Gagnalíkanið þitt lifir í kóða. Skemafskráin hjá ORM er oft skýrasta lýsingin á gögnum forritsins: hvaða töflur eru til, hvaða reiti hver þeirra hefur og hvernig þær tengjast. Ef þú lest hana sérðu fljótt hvort gervigreindin skildi forritið þitt.
- Breytingar á gagnagrunninum fara í gegnum flutninga. Þegar þú biður um „bættu símanúmeri við viðskiptavini“ uppfærir gervigreindin líkanið og býr til flutning. Ef þú veist það skilurðu betur af hverju breyting þarf að vera keyrð áður en hún virkar í beinni.
- Öryggi sjálfgefið. ORM smíða fyrirspurnir á þann hátt að þær verja gegn SQL-innspýtingu (SQL injection), einni algengustu öryggisgloppunni í forritum sem setja fyrirspurnir saman í höndunum.
- Hraðagildrur. ORM gera það auðvelt að keyra óvart hundruð smárra fyrirspurna þar sem ein hefði nægt. Það er algeng ástæða þess að síður í forritum sem gervigreind hefur smíðað verða hægar.
Dæmisaga úr daglegu lífi
Ímyndaðu þér breskan ferðamann og japanskan verslunareiganda sem skilja ekki hvor annan og vinna í gegnum túlk.
Ferðamaðurinn (forritið þitt) segir: „Mig langar í þrjú ódýrustu tein sem þú átt.“ Túlkurinn (ORM) þýðir það yfir á nákvæmt japanska mál (SQL), kemur því til verslunareigandans (gagnagrunnsins) og þýðir svarið aftur á ensku.
Ferðamaðurinn lærir aldrei japönsku og í flestum samtölum er það í lagi. En í flóknum samningaviðræðum getur verið gott að tala beint, og þess vegna leyfa flest ORM forriturum að skrifa hrátt SQL þegar þörf krefur.
Hvernig ORM virkar
Gagnagrunnar eins og Postgres geyma gögn í töflum með röðum og dálkum og er flett upp með SQL. Forritunarmál vinna með hluti: bókun með date, customer og status. ORM tengir þetta saman:
| Gagnagrunnshlið | ORM / kóðahlið |
|---|---|
Tafla bookings | Líkan Booking |
| Röð | Einn bókunarhlutur |
Dálkur starts_at | Reitur startsAt |
Erlendur lykill customer_id | Tengsl booking.customer |
SELECT, INSERT, UPDATE, DELETE | Aðferðirnar find, create, update, delete |
Þessar fjórar aðgerðir eru CRUD-aðgerðirnar sem næstum allt forrit byggist á.
Vinnudæmi: bókanir með Prisma
Hér er einfölduð Prisma-skema fyrir bókunarforrit fyrir hársnyrtistofu. Hún lýsir tveimur töflum og hvernig þær tengjast:
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
}
Í einföldu máli: viðskiptavinur hefur nafn, einstakt netfang og margar bókanir; hver bókun hefur upphafstíma, þjónustu og tilheyrir einum viðskiptavini.
Nú vill forritið fá „næstu bókanir Lenu, þær fyrstu fyrst“:
const bookings = await db.booking.findMany({
where: {
customer: { email: "lena@example.com" },
startsAt: { gte: new Date() },
},
orderBy: { startsAt: "asc" },
});
ORM þýðir þetta í SQL í stórum dráttum á þessa leið, keyrir það og skilar lista af bókunarhlutum:
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;
Skammtarnir $1 og $2 eru staðgenglar: netfangið og dagsetningin eru send sér frá fyrirspurnartextanum, og það kemur í veg fyrir SQL-innspýtingu.
Flutningar
Segjum svo að þú biðjir um „leyfðu viðskiptavinum að bæta við símanúmeri“. Þá bætir gervigreindin við phone String? í líkaninu Customer (? þýðir að reiturinn er valfrjáls) og býr til flutning, lítið SQL-skriftuverk eins og ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;. Flutningar eru vistaðir í röð, svo hægt er að færa hvert eintak gagnagrunnsins í sömu uppbyggingu, og breytingasagan varðveitist.
Algeng ORM eftir forritunarmáli
| Forritunarmál | Algeng ORM |
|---|---|
| TypeScript / JavaScript | Prisma, Drizzle, TypeORM, Sequelize |
| Python | SQLAlchemy, Django ORM, SQLModel |
| C# | Entity Framework Core |
| Java | Hibernate (oft í gegnum Spring Data JPA) |
| Ruby | Active Record |
ORM eru mismunandi í því hversu mikið þau fela SQL. Prisma notar sitt eigið skemamál og fyrirspurnarstíl; Drizzle heldur sér viljandi nær lögun SQL en gerir allt þó týpað. Léttari verkfæri sem kallast fyrirspurnasmiðir (query builders), eins og Knex eða Kysely fyrir TypeScript, hjálpa til við að smíða SQL í kóða án þess að breyta röðum í fulla hluti.
Lykilhugtök
| Hugtak | Merking |
|---|---|
| Líkan (model) | Kóðalýsing á töflu og reitum hennar. |
| Skema (schema) | Full lýsing á öllum töflum, reitum og tengslum. |
| Tengsl (relation) | Tenging milli líkana, til dæmis að bókun tilheyri viðskiptavini. |
| Flutningur (migration) | Útgáfumerkt skriftuverk sem breytir uppbyggingu gagnagrunnsins. |
| Fyrirspurnasmiður (query builder) | Léttara verkfæri til að smíða SQL í kóða án fullrar hlutakortlagningar. |
| N+1 vandamálið | Keyra eina fyrirspurn fyrir lista og síðan eina í viðbót fyrir hvern lið, sem er hægt þegar gögnin verða mörg. |
| Hrátt SQL (raw SQL) | SQL skrifað í höndunum, notað þegar ORM stendur í vegi. |
Algengar misskilningar
- „ORM er gagnagrunnur.“ Það er ekki satt. Það er þýðandi. Þú þarft samt gagnagrunn eins og Postgres.
- „Með ORM þarftu ekki að skilja gögnin þín.“ Illa hönnuð gagnatafla er jafn erfið í gegnum ORM. Gott gagnalíkan skiptir meira máli en verkfærið.
- „ORM eru alltaf hæg.“ Venjulegar fyrirspurnir eru í lagi. Hægagangurinn stafar oftast af mynstrum eins og N+1 fyrirspurnum eða vantandi vísitölum, og það er hægt að laga.
- „ORM þýðir enga hættu á SQL-innspýtingu, aldrei.“ Staðlaðar ORM-aðferðir eru öruggar, en hrátt SQL sem notar innlímt innslag frá notendum er samt hættulegt.
- „Breyting á skemafskránni breytir lifandi gagnagrunninum.“ Aðeins þegar flutningur hefur verið búinn til og keyrður á þeim gagnagrunni.
Hvað á að spyrja gervigreindarsmiðinn þinn
- „Sýndu mér gagnagrunnsskemað og útskýrðu hverja töflu og tengsl á einföldu máli.“
- „Hvaða ORM notar þetta verkefni og hvar eru flutningarnir?“
- „Áður en þú breytir einhverri töflu, segðu mér hvort gögnin sem fyrir eru verði fyrir áhrifum, og fjarlægðu aldrei dálk með gögnum án þess að spyrja fyrst.“
- „Athugaðu hægustu síðurnar með tilliti til N+1 fyrirspurna og bættu við vísitölum þar sem listar eru síaðir eða raðaðir.“
- „Gakktu úr skugga um að allar fyrirspurnir sem nota innslag frá notendum fari í gegnum ORM eða noti breytur, engin SQL-strengjasmíði.“
ORM í Mythex
Þegar forritið þitt þarf að vista gögn bætir Mythex sérstökum Postgres-gagnagrunni við verkefnið. Biddu um það í spjallinu eða notaðu skipunina /database. Tengiupplýsingarnar eru settar inn í vinnusvæðið og birtu appið (Gagnagrunnur). Gervigreindarfulltrúinn skrifar síðan kóðann sem les og vistar gögnin þín. Ef þú hefur val, til dæmis „notaðu Prisma“, „notaðu SQLAlchemy“ eða „hreint SQL, enginn ORM“, segðu það í spjallinu. Biddu um yfirferð á skemanu hvenær sem þú vilt kanna uppbygginguna; þú getur lesið skrárnar í kóðaritlinum. Fyrir stærri myndina sjá hvað er gagnagrunnur og SQL vs NoSQL.
Spurningar
Hvað er ORM í einföldu máli?
ORM (object-relational mapper) er forritasafn sem situr á milli forritsins og tengds gagnagrunns. Það gerir forriturum kleift að lesa og vista gögn sem venjulega hluti í forritunarmálinu og skrifar SQL-fyrirspurnirnar fyrir þá á bak við tjöldin.
Hver eru dæmi um ORM?
Algeng ORM eru Prisma og Drizzle fyrir TypeScript og JavaScript, SQLAlchemy og Django ORM fyrir Python, Entity Framework Core fyrir C#, Hibernate fyrir Java og Active Record í Ruby on Rails.
Er ORM betra en að skrifa SQL?
Það fer eftir verkefninu. ORM gerir daglegan lestur og skrif fljótlegri að skrifa, öruggari og auðveldari að breyta, en SQL skrifað í höndunum gefur fulla stjórn á flóknum skýrslum eða fyrirspurnum sem skipta miklu fyrir afköst. Flest ORM leyfa þér að fara niður í hrátt SQL þegar þörf krefur.
Hvað er flutningur (migration)?
Flutningur er lítið, útgáfumerkt skriftuverk sem breytir uppbyggingu gagnagrunnsins, til dæmis með því að bæta við töflu eða dálki. ORM geta búið til flutninga út frá gagnalíkaninu þínu, svo að hvert eintak gagnagrunnsins, á fartölvu, í prófunum og í framleiðslu, endi með sömu uppbyggingu.