Què és un ORM? Com les aplicacions parlen amb les bases de dades, explicat
Un ORM (object-relational mapper) és una biblioteca de codi que se situa entre una aplicació i una base de dades relacional. En lloc d'escriure consultes de base de dades en SQL, els desenvolupadors treballen amb les dades com a objectes normals del seu llenguatge de programació —db.booking.create(...) o Booking.find(...)— i l'ORM ho tradueix a SQL, l'executa i torna els resultats convertits en objectes. Exemples populars són Prisma i Drizzle per a TypeScript, SQLAlchemy per a Python i Entity Framework Core per a C#.
Per què importen els ORM quan construeixes amb IA
Quan un constructor d'aplicacions amb IA afegeix una base de dades a la teva aplicació, normalment també hi afegeix un ORM per parlar-hi. No hauràs d'escriure codi d'ORM, però ajuda saber que hi és:
- El model de dades viu al codi. El fitxer d'esquema de l'ORM sovint és la descripció més clara de les dades de la teva aplicació: quines taules existeixen, quins camps té cadascuna i com es connecten. Llegir-lo és una manera ràpida de comprovar que la IA ho ha entès.
- Els canvis a la base de dades passen per migracions. Quan demanes «afegeix un número de telèfon als clients», la IA actualitza el model i crea una migració. Saber-ho t'ajuda a entendre per què un canvi pot haver d'aplicar-se abans de funcionar en directe.
- Seguretat per defecte. Els ORM construeixen les consultes de manera que es protegeixen contra la injecció SQL, un dels forats de seguretat més habituals en aplicacions que munten consultes a mà.
- Trampes de velocitat. Els ORM fan fàcil executar sense voler centenars de consultes petites quan en bastaria una. És una causa habitual de pàgines lentes en aplicacions construïdes amb IA.
Una analogia del dia a dia
Imagina un viatger català i un botiguer japonès que no comparteixen idioma i es comuniquen a través d'un intèrpret.
El viatger (la teva aplicació) diu: «M'agradaria els tres tès més barats que tingueu». L'intèrpret (l'ORM) ho tradueix a un japonès precís (SQL), ho passa al botiguer (la base de dades) i tradueix la resposta de nou al català.
El viatger no aprèn japonès, i per a la majoria de converses això és suficient. Però per a una negociació complicada pot ajudar parlar directament, per això la majoria d'ORM deixen als desenvolupadors escriure SQL en brut quan cal.
Com funciona un ORM
Bases de dades com Postgres emmagatzemen les dades en taules de files i columnes, i es consulten amb SQL. Els llenguatges de programació treballen amb objectes: una reserva amb una data, un client i un estat. L'ORM relaciona un món amb l'altre:
| Costat de la base de dades | Costat de l'ORM / codi |
|---|---|
Taula bookings | Model Booking |
| Fila | Un objecte de reserva |
Columna starts_at | Camp startsAt |
Clau forana customer_id | Relació booking.customer |
SELECT, INSERT, UPDATE, DELETE | Mètodes find, create, update, delete |
Aquestes quatre operacions són les accions CRUD sobre les quals es basa gairebé qualsevol aplicació.
Un exemple pas a pas: reserves amb Prisma
Aquí teniu un esquema simplificat de Prisma per a una aplicació de reserves d'una perruqueria. Descriu dues taules i com s'enllacen:
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
}
En paraules senzilles: un client té un nom, un correu electrònic únic i moltes reserves; cada reserva té una hora d'inici, un servei i pertany a un sol client.
Ara l'aplicació vol «les properes reserves de la Lena, la més propera primer»:
const bookings = await db.booking.findMany({
where: {
customer: { email: "lena@example.com" },
startsAt: { gte: new Date() },
},
orderBy: { startsAt: "asc" },
});
L'ORM ho converteix en SQL més o menys així, l'executa i retorna una llista d'objectes de reserva:
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;
Els $1 i $2 són marcadors de posició: el correu electrònic i la data s'envien per separat del text de la consulta, i això és el que impedeix la injecció SQL.
Migracions
Si després demanes «deixa que els clients afegeixin un número de telèfon», la IA afegeix phone String? al model Customer (el ? vol dir que és opcional) i genera una migració: un petit script SQL com ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;. Les migracions es desen en ordre, de manera que cada còpia de la base de dades es pot portar a la mateixa estructura, i es conserva l'historial de canvis.
ORM habituals per llenguatge
| Llenguatge | ORM habituals |
|---|---|
| TypeScript / JavaScript | Prisma, Drizzle, TypeORM, Sequelize |
| Python | SQLAlchemy, ORM de Django, SQLModel |
| C# | Entity Framework Core |
| Java | Hibernate (sovint amb Spring Data JPA) |
| Ruby | Active Record |
Els ORM varien en quant amaguen el SQL. Prisma utilitza el seu propi llenguatge d'esquema i el seu estil de consulta; Drizzle manté deliberadament la forma propera al SQL i alhora tot tipat. Les eines més lleugeres anomenades constructors de consultes (query builders), com Knex o Kysely per a TypeScript, ajuden a construir SQL en el codi sense relacionar les files amb objectes complets.
Termes clau
| Terme | Significat |
|---|---|
| Model | La definició en codi d'una taula i dels seus camps. |
| Esquema | La descripció completa de totes les taules, camps i relacions. |
| Relació | Un enllaç entre models, com una reserva que pertany a un client. |
| Migració | Un script versionat que canvia l'estructura de la base de dades. |
| Constructor de consultes | Una eina més lleugera per construir SQL en el codi sense el mapatge complet a objectes. |
| Problema N+1 | Executar una consulta per a una llista i després una més per a cada element: lent a gran escala. |
| SQL en brut | SQL escrit a mà, usat quan l'ORM es interposa. |
Idees errònies habituals
- «Un ORM és una base de dades». No ho és. És un traductor. Encara necessites una base de dades com Postgres.
- «Amb un ORM no cal entendre les dades». Les taules mal dissenyades fan el mateix mal a través d'un ORM. Un bon model de dades importa més que l'eina.
- «Els ORM sempre són lents». Les consultes del dia a dia van bé. La lentitud sol venir de patrons com les consultes N+1 o de la falta d'índexs, i això es pot arreglar.
- «ORM vol dir que no hi ha mai risc d'injecció SQL». Els mètodes estàndard de l'ORM són segurs, però el SQL en brut amb entrada d'usuari enganxada encara és perillós.
- «Editar el fitxer d'esquema canvia la base de dades en directe». Només ho fa quan es crea una migració i s'aplica a aquella base de dades.
Què preguntar al teu constructor d'IA
- «Mostra'm l'esquema de la base de dades i explica cada taula i relació en català senzill.»
- «Quin ORM fa servir aquest projecte i on són les migracions?»
- «Abans de canviar qualsevol taula, digues-me si les dades existents es veuran afectades, i no eliminis mai una columna amb dades sense preguntar.»
- «Revisa les pàgines més lentes per detectar consultes N+1 i afegeix índexs on es filtrin o ordenin llistes.»
- «Assegura't que cada consulta que usa dades d'usuari passi per l'ORM o usi paràmetres: res de SQL construït amb cadenes de text.»
Els ORM a Mythex
Quan la teva aplicació necessita desar dades, Mythex afegeix una base de dades Postgres dedicada al projecte —demana-ho al xat o fes servir l'ordre /database— i injecta els seus detalls de connexió a l'espai de treball i a l'aplicació publicada (Base de dades). Després, l'agent escriu el codi que llegeix i desa les teves dades. Si tens una preferència —«fes servir Prisma», «fes servir SQLAlchemy» o «SQL pur, sense ORM»— digues-ho al xat. Demana-li que t'expliqui l'esquema sempre que vulguis comprovar l'estructura; pots llegir els fitxers a l'editor de codi. Per a la visió general, consulta què és una base de dades i SQL vs NoSQL.
Preguntes
Què és un ORM, en termes senzills?
Un ORM (object-relational mapper, o mapejador objecte-relacional) és una biblioteca de codi que se situa entre la teva aplicació i una base de dades relacional. Permet als desenvolupadors llegir i desar dades com a objectes normals del seu llenguatge de programació, i escriu per ells les consultes SQL entre bastidors.
Quins són alguns exemples d'ORM?
Els ORM més comuns són Prisma i Drizzle per a TypeScript i JavaScript, SQLAlchemy i l'ORM de Django per a Python, Entity Framework Core per a C#, Hibernate per a Java i Active Record a Ruby on Rails.
És millor un ORM que escriure SQL?
Depèn de la feina. Un ORM fa que les lectures i escriptures del dia a dia siguin més ràpides d'escriure, més segures i més fàcils de canviar, mentre que el SQL escrit a mà dona control total per a informes complexos o consultes crítiques per al rendiment. La majoria d'ORM et deixen baixar a SQL en brut quan ho necessitis.
Què és una migració?
Una migració és un script petit i versionat que canvia l'estructura de la base de dades, com ara afegir una taula o una columna. Els ORM poden generar migracions a partir del model de dades perquè cada còpia de la base de dades —al portàtil, en les proves i en producció— acabi amb la mateixa estructura.