ORM гэж юу вэ?
ORM гэдэг нь Object-Relational Mapping гэсэн үгний товчлол бөгөөд монголчилбол “Объект болон Харилцан хамааралтай өгөгдлийн сангийн холбоо” гэж ойлгож болно.
Энгийнээр хэлбэл, энэ нь таны ашиглаж буй програмчлалын хэл (Java, Python, Go г.м) болон өгөгдлийн сан (MySQL, PostgreSQL г.м) хоёрын хооронд ажилладаг “орчуулагч” юм.

Өгөгдлийн сантай ажиллахад ихэвчлэн SQL (Structured Query Language) ашигладаг. Гэвч програмчлалын хэл дээр бид “Объект” (Objects/Structs) ашигладаг. Энэ хоёр өөр бүтцийг хооронд нь холбохын тулд ORM дараах үүргийг гүйцэтгэдэг:
- SQL бичих шаардлагагүй: Та өөрийн сурсан хэл дээрээ (жишээ нь Go эсвэл Java) код бичихэд ORM түүнийг нь автоматаар SQL query рүү хөрвүүлж өгөгдлийн санд илгээнэ.
- Өгөгдлийн бүтцийг ижилсүүлэх: Өгөгдлийн сангийн “Хүснэгт”-ийг (Table) програм доторх “Класс” эсвэл “Struct”-тай шууд холбоно.
- Аюулгүй байдал: SQL Injection гэх мэт түгээмэл халдлагуудаас автоматаар хамгаалдаг.
Тэгвэл GORM гэдэг нь ялгаатай юу?
GORM гэдэг нь Go ORM буюу Go хэлний ORM бөгөөд нүсэр SQL query бичих, өгөгдлийг гар аргаар struct руу хөрвүүлэх нь цагийг хэмнэх хамгийн хүчирхэг хэрэгсэл юм.
GORM-ийн гол онцлогууд
- Auto Migration: Таны код доторх Go struct-д гарсан өөрчлөлтийг (шинэ багана нэмэх, төрөл өөрчлөх) өгөгдлийн сангийн схем рүү автоматаар шилжүүлдэг.
- Associations:
Has One,Has Many,Belongs To,Many To Manyгэх мэт хүснэгт хоорондын нарийн хамаарлуудыг маш хялбар тохируулдаг. - Hooks: Өгөгдөл хадгалагдах, устгах, шинэчлэгдэхийн өмнө болон дараа ямар нэгэн функц (жишээ нь, нууц үг hash хийх) ажиллуулах боломжтой.
- Rich Ecosystem: MySQL, PostgreSQL, SQLite, SQL Server зэрэг хамгийн түгээмэл бүх өгөгдлийн сангуудыг дэмждэг.
Хэрхэн ашиглах вэ?
Суурилуулалт:
go get -u gorm.io/gorm
go get -u gorm.io/driver/postgres # Өөрийн ашиглах DB драйверыг суулгана
Өгөгдлийн сантай холбох:
package main
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type User struct {
gorm.Model // ID, CreatedAt, UpdatedAt, DeletedAt талбаруудыг автоматаар нэмнэ
Name string
Age int
}
func main() {
dsn := "host=localhost user=gorm password=gorm dbname=gorm port=5432 sslmode=disable"
db, _ := gorm.Open(postgres.Open(dsn), &gorm.Config{})
// Хүснэгтээ автоматаар үүсгэх
db.AutoMigrate(&User{})
}
СRUD үйлдлүүд:
Create:
user := User{Name: "Egune", Age: 25}
db.Create(&user)
Read:
var user User
db.First(&user, 1) // ID = 1-тэй хэрэглэгчийг олох
db.Where("age > ?", 20).Find(&users)
Update:
db.Model(&user).Update("Age", 26)
Delete:
db.Delete(&user, 1) // GORM нь "Soft Delete" буюу өгөгдлийг бүрмөсөн устгахгүйгээр 'deleted_at' тэмдэглэгээ хийдэг.
Хэрэглэх шаардлагатай юу?
| Давуу тал: | Сул тал: |
| Бэлэн CRUD функцуудыг хэдхэн секундэд бичих боломж олгоно. Мөн өгөгдлийн сангийн хүснэгтээ гараар үүсгэх шаардлагагүй. Go struct-аа өөрчлөхөд л DB тань дагаад шинэчлэгдэнэ. | GORM нь Go-ийн Reflection (ажиллах явцад өгөгдлийн төрлийг тодорхойлох) механизмыг ихээр ашигладаг. Raw SQL ашигласнаас ялимгүй удаан ажиллах учраас ачаалалтай системд энэ нь мэдэгдэхүйц ялгаа гаргаж магадгүй. |
| “Soft Delete” – өгөгдлийг устгах үед тэр нь өгөгдлийн сангаас бүрмөсөн алга болохгүй. | “Magic” буюу Далд үйлдлүүд |
| SQLite дээр туршиж үзээд, дараа нь PostgreSQL эсвэл MySQL рүү шилжихэд кодоо бүгдийг нь өөрчлөх шаардлагагүй. Зөвхөн холболтын хэсгийг л (DSN) өөрчлөхөд хангалттай. | N+1 Query асуудал: Хэрэв та User татахдаа түүний Orders-ыг хамт татахаар бол Preload функцийг ашиглах ёстой. Хэрэв мартвал GORM хэрэглэгч бүрт зориулж тусад нь SQL query ажиллуулж, системийг маш их удаашруулна. |
| Анхлан суралцагчдын гаргадаг хамгийн том алдаа болох SQL Injection-оос GORM автоматаар хамгаалдаг. Учир нь утгуудыг “Parameterized Query” болгож дамжуулдаг. | Маш нарийн JOIN, Subquery эсвэл статистик тооцоолол хийх шаардлагатай үед GORM-ийн бичиглэл нь Raw SQL-ээсээ илүү хүнд, ойлгомжгүй болох талтай. Ийм үед GORM-ийн db.Raw()-ийг ашиглаж SQL-ээ шууд бичих нь дээр байдаг. |
Түгээмэл ORM-ууд:
- Go: GORM, Ent
- Java: Hibernate, JPA
- Python: SQLAlchemy, Django ORM
- JavaScript/TypeScript: Prisma, Sequelize
Зөвлөгөө
“GORM-ийг ашиглаж байгаа гээд SQL сурах хэрэггүй гэсэн үг биш.” Шилдэг хөгжүүлэгчид GORM-ийг хурдны төлөө ашигладаг ч, цаана нь ямар SQL ажиллаж байгааг үргэлж хянаж (Debug log ашиглан) байдаг.
Боловсролыг инженерчлэв.
