ToanNV's Blog
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(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ư:
Và cả GORM trong golang.
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.
Phần này có một số lưu ý khi tạo model với Struct tags
.
Tag | giả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 |
INDEX | Tạo index với cột dữ liệu |
UNIQUE_INDEX | tạo unique index |
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"
}
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 đây và tại đây
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.
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
// begin transaction
BeforeSave
BeforeUpdate
// save before associations
// update timestamp `UpdatedAt`
// save self
// save after associations
AfterUpdate
AfterSave
// commit or rollback transaction
// begin transaction
BeforeDelete
// delete self
AfterDelete
// commit or rollback transaction
// load data from database
// Preloading (eager loading)
AfterFind