Mga gabay

Ano ang ORM? Paano Nakikipag-usap ang mga App sa Database, Ipinaliwanag

Ang ORM (object-relational mapper) ay isang code library na nasa pagitan ng app at ng relational database. Sa halip na sumulat ng database queries sa SQL, nagtatrabaho ang developer sa datos bilang ordinaryong object sa programming language nila, gaya ng db.booking.create(...) o Booking.find(...). Isinasalin ito ng ORM sa SQL, pinapatakbo, at ibinabalik ang resulta bilang mga object. Kabilang sa mga sikat na halimbawa ang Prisma at Drizzle para sa TypeScript, SQLAlchemy para sa Python, at Entity Framework Core para sa C#.

Bakit mahalaga ang ORM kapag gumagawa ka gamit ang AI

Kapag nagdagdag ang AI app builder ng database sa app mo, kadalasan ay nagdadagdag din ito ng ORM para makipag-usap dito. Hindi mo kailangang sumulat ng ORM code, pero makakatulong na malaman mong nandiyan ito:

  • Nasa code ang data model mo. Kadalasan, ang schema file ng ORM ang pinakamalinaw na paglalarawan ng datos ng app mo: anong mga table ang umiiral, anong field ang bawat isa, at paano sila nagkakaugnay. Ang pagbabasa nito ay mabilis na paraan para makita kung naintindihan ng AI ang app mo.
  • Dumadaan sa migrations ang mga pagbabago sa database. Kapag humiling ka ng "magdagdag ng phone number sa mga customer", ina-update ng AI ang model at gumagawa ng migration. Makakatulong ang kaalamang ito para maintindihan kung bakit kailangang ma-apply muna ang isang pagbabago bago ito gumana nang live.
  • Ligtas bilang default. Gumagawa ang ORM ng queries sa paraang nagpoprotekta laban sa SQL injection, isa sa pinakakaraniwang security hole sa mga app na manual na bumubuo ng query.
  • Mga bitag sa bilis. Madaling makapagpatakbo ang ORM ng daan-daang maliliit na query kung saan sana isa lang ang kailangan. Karaniwang dahilan ito ng mabagal na page sa mga app na gawa ng AI.

Isang pang-araw-araw na paghahambing

Isipin ang isang turistang Briton at isang shopkeeper sa Japan na walang iisang wika, at nag-uusap sila sa pamamagitan ng interpreter.

Sabi ng turista (ang app mo), "Gusto ko ang tatlong pinakamurang tsaa ninyo." Isinasalin ito ng interpreter (ang ORM) sa tumpak na Hapon (SQL), ipinapasa sa shopkeeper (ang database), at isinasalin pabalik ang sagot sa Ingles.

Hindi natututo ang turista ng Hapon, at para sa karaniwang usapan ay okay lang iyon. Pero sa mas kumplikadong negosasyon, mas mainam magsalita nang direkta, kaya karamihan ng ORM ay nagpapahintulot sa developer na sumulat ng raw SQL kapag kailangan.

Paano gumagana ang ORM

Ang mga database gaya ng Postgres ay nag-iimbak ng datos sa tables na may rows at columns, at kino-query gamit ang SQL. Ang mga programming language naman ay nagtatrabaho sa objects: isang booking na may date, customer at status. Ang ORM ang nagmamapa sa dalawa:

Panig ng databasePanig ng ORM / code
Table bookingsModel Booking
RowIsang booking object
Column starts_atField startsAt
Foreign key customer_idRelation booking.customer
SELECT, INSERT, UPDATE, DELETEMga method na find, create, update, delete

Ang apat na operasyong ito ang mga CRUD na aksyon na halos lahat ng app ay nakabatay.

Isang worked example: mga booking gamit ang Prisma

Narito ang pinasimpleng Prisma schema para sa isang salon booking app. Naglalarawan ito ng dalawang table at kung paano sila konektado:

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
}

Sa simpleng salita: ang customer ay may pangalan, natatanging email, at maraming booking; ang bawat booking ay may oras ng simula, serbisyo, at kabilang sa isang customer.

Ngayon, gusto ng app ang "mga paparating na booking ni Lena, pinakamalapit muna":

const bookings = await db.booking.findMany({
  where: {
    customer: { email: "lena@example.com" },
    startsAt: { gte: new Date() },
  },
  orderBy: { startsAt: "asc" },
});

Isinasalin ito ng ORM sa SQL na humigit-kumulang ganito, pinapatakbo, at ibinabalik ang listahan ng booking objects:

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;

Ang $1 at $2 ay mga placeholder: ang email at petsa ay ipinapadala nang hiwalay sa teksto ng query, at iyon ang pumipigil sa SQL injection.

Migrations

Kung sunod mong hilingin ang "hayaang magdagdag ng phone number ang mga customer", idaragdag ng AI ang phone String? sa Customer model (ang ? ay nangangahulugang opsyonal) at gagawa ng migration, isang maliit na SQL script gaya ng ALTER TABLE "Customer" ADD COLUMN "phone" TEXT;. Naka-save ang mga migration nang sunod-sunod, kaya maidadala ang bawat kopya ng database sa parehong istruktura, at nananatili ang kasaysayan ng mga pagbabago.

Karaniwang ORM ayon sa wika

WikaKaraniwang ORM
TypeScript / JavaScriptPrisma, Drizzle, TypeORM, Sequelize
PythonSQLAlchemy, Django ORM, SQLModel
C#Entity Framework Core
JavaHibernate (kadalasan sa pamamagitan ng Spring Data JPA)
RubyActive Record

Iba-iba ang antas ng pagtatago ng ORM sa SQL. Gumagamit ang Prisma ng sarili nitong schema language at estilo ng query; sinasadya ng Drizzle na manatiling malapit sa hugis ng SQL habang nananatiling typed ang lahat. Ang mas magagaan na kasangkapang tinatawag na query builders, gaya ng Knex o Kysely para sa TypeScript, ay tumutulong bumuo ng SQL sa code nang hindi minamapa ang rows bilang buong object.

Mahahalagang termino

TerminoKahulugan
ModelAng definition sa code ng isang table at mga field nito.
SchemaAng buong paglalarawan ng lahat ng table, field at relasyon.
RelationAng koneksyon ng mga model, gaya ng booking na kabilang sa isang customer.
MigrationIsang may-bersyong script na nagbabago sa istruktura ng database.
Query builderMas magaang kasangkapan para bumuo ng SQL sa code nang walang buong object mapping.
N+1 problemIsang query para sa listahan, tapos isa pa para sa bawat item. Mabagal kapag malaki na.
Raw SQLSQL na isinulat ng kamay, ginagamit kapag nakakasagabal ang ORM.

Mga karaniwang maling akala

  • "Ang ORM ay database." Hindi. Tagasalin ito. Kailangan mo pa rin ng database gaya ng Postgres.
  • "Sa ORM, hindi mo na kailangang intindihin ang datos mo." Ang mga table na mahina ang disenyo ay nakakainis din kahit sa pamamagitan ng ORM. Mas mahalaga ang magandang data model kaysa sa tool.
  • "Laging mabagal ang ORM." Okay lang ang karaniwang query. Kadalasan, galing ang bagal sa mga pattern gaya ng N+1 queries o kulang na indexes, at naaayos ang mga iyon.
  • "Ibig sabihin ng ORM ay walang panganib ng SQL injection, kailanman." Ligtas ang karaniwang ORM methods, pero mapanganib pa rin ang raw SQL na may user input na idinikit.
  • "Ang pag-edit ng schema file ay nagbabago sa live na database." Hindi, maliban kung nagawa na ang migration at na-apply na ito sa database na iyon.

Ano ang itatanong sa iyong AI builder

  • "Ipakita mo ang database schema at ipaliwanag sa simpleng Ingles ang bawat table at relasyon."
  • "Anong ORM ang ginagamit ng project na ito, at nasaan ang mga migration?"
  • "Bago baguhin ang anumang table, sabihin mo kung maaapektuhan ang umiiral na datos, at huwag magbura ng column na may datos nang hindi nagtatanong muna."
  • "Tingnan ang pinakamabagal na page para sa N+1 queries at magdagdag ng indexes kung saan sinasala o inaayos ang mga listahan."
  • "Siguraduhing dumadaan sa ORM o gumagamit ng parameters ang bawat query na may user input. Walang SQL na binuo sa pamamagitan ng string."

Mga ORM sa Mythex

Kapag kailangang mag-save ng datos ng app mo, nagdadagdag ang Mythex ng nakalaang Postgres database sa project. Magtanong lang sa chat o gamitin ang /database na command. Isinasaksak nito ang connection details sa workspace at sa published app (Database). Ang agent na ang sumusulat ng code na bumabasa at nagse-save ng datos mo. Kung may kagustuhan ka, gaya ng "gamitin ang Prisma", "gamitin ang SQLAlchemy", o "plain SQL, walang ORM", sabihin mo ito sa chat. Hilingin mong ipaliwanag sa iyo ang schema kahit kailan mo gusto. Mababasa mo rin ang mga file sa code editor. Para sa mas malawak na larawan, tingnan ang ano ang database at SQL vs NoSQL.

Mga tanong

Ano ang ORM sa simpleng salita?

Ang ORM (object-relational mapper) ay isang code library na nasa pagitan ng app mo at ng relational database. Hinahayaan nitong basahin at i-save ng developer ang datos bilang ordinaryong object sa programming language nila, at ito na ang sumusulat ng SQL queries sa likod.

Ano ang mga halimbawa ng ORM?

Kabilang sa mga karaniwang ORM ang Prisma at Drizzle para sa TypeScript at JavaScript, SQLAlchemy at Django ORM para sa Python, Entity Framework Core para sa C#, Hibernate para sa Java, at Active Record sa Ruby on Rails.

Mas maganda ba ang ORM kaysa sumulat ng SQL?

Depende sa trabaho. Mas mabilis, mas ligtas, at mas madaling baguhin ang karaniwang pagbasa at pagsulat ng datos gamit ang ORM, habang ang sariling-sulat na SQL ay nagbibigay ng buong kontrol para sa kumplikadong report o query na sensitibo sa bilis. Karamihan ng ORM ay nagpapahintulot na bumaba sa raw SQL kapag kailangan.

Ano ang migration?

Ang migration ay maliit at may-bersyong script na nagbabago sa istruktura ng database, gaya ng pagdaragdag ng table o column. Puwedeng gumawa ng migrations ang ORM mula sa data model mo para pareho ang istruktura ng bawat kopya ng database, sa laptop, sa testing, at sa production.

Mythex · Pricing · Gumawa ng kahit ano gamit ang AI · Mga template ng website at app · Paghahambing ng Mythex · Glosaryo ng paggawa ng app gamit ang AI · Mga libreng tool sa paggawa ng app gamit ang AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)