ToanNV's Blog

ToanNV

Developer, living in Tokyo, get married.


"Before you criticize someone, you should walk a mile in their shoes. That way when you criticize them, you are a mile away from them and you have their shoes." —Jack Handey

Tìm hiểu GORM

ORM là gì?

ORM(Object Relational Mapping) là kỹ thuật lập trình ánh xạ các bản ghi từ hệ quản trị cơ sở dữ liệu sang dạng đối tượng được định nghĩa trong các class. Kỹ thuật này được dùng phổ biến hiện nay, đặc biệt là phần backend. Và hầu hết các ngôn ngữ hiện nay đều có các thư viện hỗ trợ ORM.

Ví dụ như:

  • Hibernate trong java
  • SQLAlchemy trong python
  • Sequelize trong node.js
  • Active Record trong ruby

Và cả GORM trong golang.

GORM

GORM là thư viện ORM dành cho golang, giúp các lập trình viên thao tác với cơ sở dữ liệu dễ dàng và tối ưu hơn. Và dĩ nhiên, GORM cũng có đủ các chức năng của ORM.

Về vấn đề cài đặt cũng như sử dụng thì mời các bạn tham khảo ở đây. Trong bài viết này mình chỉ điểm lại các lưu ý khi dùng GORM.

Declaring Models

Phần này có một số lưu ý khi tạo model với Struct tags.

Taggiải thích
Typeđịnh nghĩa type của cột dữ liệu. ví dụ trong database là kiêu uuid, nhưng trong golang thì nó là string
INDEXTạo index với cột dữ liệu
UNIQUE_INDEXtạo unique index

gorm.Model

Là struct gồm các trường: ID, CreatedAt, UpdatedAt, DeletedAt. Nó có thể được nhúng vào trong model.

Trong gorm thì trường ID mặc định là khoá chính của table.

// gorm.Model definition
type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}

// Inject fields `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt` into model `User`
type User struct {
  gorm.Model
  Name string
}

// Declaring model w/o gorm.Model
type User struct {
  ID   int
  Name string
}

Tên của table mặc định là tên số nhiều của model.

type User struct {} // default table name is `users`

Muốn customize tên của table thì dùng hàm hooks TableName

type User struct {} // default table name is `users`

// Set User's table name to be `profiles`
func (User) TableName() string {
  return "profiles"
}

Connecting to database

Gorm hỗ trợ cho sqlite, mysql, postgres, mssql. Tuy nhiên, chúng ta có thể kết nối tới các loại db khác bằng cách tạo mới một dialect. Tham khảo thêm tại đâytại đây

Hooks

Gorm hỗ trợ các hàm hooks được gọi trước khi thực thi một hành động như creation/querying/updating/deletion.

Nếu trong model chúng ta định nghĩa các hàm hooks, chúng sẽ được tự động thực thi trước khi thực thi các hành động như kể trên. Nếu hàm trả về kết quả lỗi thì gorm sẽ stop lại các action đó và rollback transaction hiện tại.

Creation

Các hàm hooks của action creation

// begin transaction
BeforeSave
BeforeCreate
// save before associations
// update timestamp `CreatedAt`, `UpdatedAt`
// save self
// reload fields that have default value and its value is blank
// save after associations
AfterCreate
AfterSave
// commit or rollback transaction

Updating

// begin transaction
BeforeSave
BeforeUpdate
// save before associations
// update timestamp `UpdatedAt`
// save self
// save after associations
AfterUpdate
AfterSave
// commit or rollback transaction

Deleting

// begin transaction
BeforeDelete
// delete self
AfterDelete
// commit or rollback transaction

Querying

// load data from database
// Preloading (eager loading)
AfterFind

Associations

Migration

Preloading