GORM là gì?

GORM (Go Object Relational Mapper) là một thư viện ORM cho Go giúp lập trình viên dễ dàng làm việc với cơ sở dữ liệu thông qua các struct thay vì viết câu lệnh SQL thủ công.

GORM hỗ trợ nhiều CSDL như:

  • PostgreSQL
  • MySQL
  • SQLite
  • SQL Server

Các tính năng chính

  • Tự động migrate schema (tạo bảng từ struct)
  • Hỗ trợ CRUD đầy đủ
  • Hỗ trợ các loại quan hệ: One-To-One, One-To-Many, Many-To-Many
  • Hỗ trợ transaction
  • Truy vấn với hooks, preload
  • Hỗ trợ SQL thuần khi cần
  • Tùy chỉnh bảng, cột, index, khóa chính/phụ, khóa ngoại, constraints,…

Cài đặt và cấu hình

Cài đặt thư viện

go get -u gorm.io/gorm
go get -u gorm.io/driver/postgres # Có thể dùng mysql, sqlite, sqlserver

Kết nối đến CSDL (ví dụ PostgreSQL)

import (
  "gorm.io/gorm"
  "gorm.io/driver/postgres"
)

func ConnectDB() (*gorm.DB, error) {
  dsn := "host=localhost user=postgres password=yourpassword dbname=testdb port=5432 sslmode=disable"
  db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
  return db, err
}

Tạo model với GORM

Ví dụ model User:

type User struct {
  ID uint `gorm:"primaryKey"`
  Name string
  Email string `gorm:"uniqueIndex"`
  Age int
  CreatedAt time.Time
  UpdatedAt time.Time
}
  • gorm:"primaryKey" → đánh dấu cột là khóa chính
  • gorm:"uniqueIndex" → tạo index duy nhất

Tự động tạo bảng từ struct:

db.AutoMigrate(&User{})

Các thao tác CURD với GORM

CREATE

user := User{Name: "Alice", Email: "[email protected]", Age: 25}
result := db.Create(&user) // tạo bản ghi

READ

var user User
db.First(&user, 1) // Tìm theo ID

db.Where("email = ?", "[email protected]").First(&user)

var users []User
db.Find(&users) // Lấy tất cả

UPDATE

db.Model(&user).Update("Age", 26)

db.Model(&user).Updates(User{Name: "Bob", Age: 30}) // cập nhật nhiều trường

DELETE

db.Delete(&user)

db.Delete(&User{}, 1) // Xoá theo ID

Quản lý mối quan hệ trong GORM

One-to-One

type Profile struct {
  ID uint
  UserID uint
  Bio string
}

type User struct {
  ID uint
  Name string
  Profile Profile `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}

One-to-Many

type Post struct {
  ID uint
  Title string
  UserID uint
}

type User struct {
  ID uint
  Name string
  Posts []Post
}

Many-to-Many

type User struct {
  ID uint
  Name string
  Roles []Role `gorm:"many2many:user_roles"`
}

type Role struct {
  ID uint
  Name string
}

Preload dữ liệu quan hệ

var user User
db.Preload("Profile").First(&user)

db.Preload("Posts").Find(&user)

 

About the Author

Đức Phát

View all author's posts

Leave a Comment

Your email address will not be published. Required fields are marked *

Bài viết khác

So sánh giữa gorm vs go-pg vs bun

Trong thế giới phát triển Golang, việc tương tác với cơ sở dữ liệu là một phần không thể thiếu của hầu hết các ứng dụng. Để đơn giản hóa quy trình này, các thư viện ORM (Object-Relational Mapping) ra đời, giúp các nhà phát triển thao tác với database thông qua các đối tượng […]

So sánh GORM vs go-pg vs Bun

Cộng đồng GORM Là ORM phổ biến nhất trong cộng đồng Go. Có nhiều tài liệu, ví dụ, StackOverflow câu trả lời, và nhiều package hỗ trợ mở rộng. Nhiều developer đã từng dùng Gorm. go-pg Từng rất phổ biến khi chỉ dùng PostgreSQL, nhưng đang bị Bun thay thế dần. Ít được duy trì […]

clean architecture golang

  1.Clean Architecture là gì? Clean Architecture là một kiến trúc phần mềm được đề xuất bởi Robert C. Martin (Uncle Bob) nhằm mục tiêu tách biệt rõ ràng giữa các tầng trong ứng dụng, giúp mã nguồn dễ bảo trì, mở rộng, và kiểm thử. 2.Tổng quan kiến trúc Entity (Domain Model): Là tầng […]

Tìm hiểu Hexagonal Architecture

Hexagonal Architecture là gì? Hexagonal Architecture (tên gọi khác là ports and adapters architecture), là một mẫu kiến trúc được dùng trong thiết kế phần mềm. Nó hướng tới việc xây dựng ứng dụng xoay quanh business/application logic mà không ảnh hưởng hoặc phụ thuộc bởi bất kì thành phần bên ngoài, mà chỉ giao […]

Sử dụng Request/Response trong ứng dụng RESTful mô hình MVC

DTO là gì? DTO (Data Transfer Object) là một object trung gian dùng để truyền dữ liệu giữa client – server hoặc giữa các service trong ứng dụng web/API theo kiến trúc RESTful API. DTO chỉ chứa các thông tin cần thiết mà client hoặc service khác cần (ví dụ: Login Form chỉ cần thông […]

Docker

Docker là gì? Docker là một nền tảng mã nguồn mở cho phép bạn đóng gói, phân phối và chạy ứng dụng bên trong các “container” – những môi trường ảo nhẹ, cô lập nhưng vẫn chia sẻ nhân hệ điều hành của máy chủ. Khái niệm then chốt ở đây là “containerization”: thay vì […]