前言
在開發(fā)過程中,程序員最牛杯的技能就是對數(shù)據(jù)庫的CRUD操作,那在操作數(shù)據(jù)庫的過程中,程序員需要知道哪些事情?
- 數(shù)據(jù)庫鏈接
- sql語句
- 新增(Create)、讀取(Read)、更新(Update)、刪除數(shù)據(jù)(Delete)
- ORM(Object Relational Mapping),對象關(guān)系映射,指將數(shù)據(jù)庫表的結(jié)構(gòu)與對象數(shù)據(jù)結(jié)構(gòu)進行自動映射
在Java web 中,有mybaties、mybaties plus 、spring boot jpa、hibernate等優(yōu)秀ORM框架,在開發(fā)過程中簡化我們的數(shù)據(jù)庫操作代碼,專注業(yè)務代碼開發(fā),提高開發(fā)效率。
在go項目開發(fā)中,有類似這樣的ORM框架嗎?gorm 就是go語言的一個ORM框架。
gorm 使用
本節(jié)將了解gorm的基本使用:
- gorm 安裝
- gorm 數(shù)據(jù)庫鏈接
- gorm crud操作
- gorm orm 基本映射
gorm 安裝
# gorm
go get -u gorm.io/gorm
# gorm mysql數(shù)據(jù)庫鏈接驅(qū)動
go get -u gorm.io/driver/mysql
創(chuàng)建數(shù)據(jù)庫鏈接
dns := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dns), &gorm.Config{})
if err != nil {
logrus.Fatalln("初始化mysql數(shù)據(jù)庫連接錯誤。%v", err)
}
CRUD
mport (
"errors"
"gorm.io/gorm"
"org.chatgin/internal/config"
)
// 結(jié)構(gòu)體必須依賴 gorm.Model
type UserBasic struct {
gorm.Model
Account string //賬號
Username string // 用戶明
Passwrod string // 登錄密碼
State int16 // 用戶狀態(tài), -1 - 異常;0 - 鎖定;1 - 正常;
}
type UserRepository struct {
}
// 初始化表結(jié)構(gòu),如果存在則不創(chuàng)建
func InitTables() {
// 如果表不存在則自動創(chuàng)建表
config.MysqlDB.AutoMigrate(&repository.UserBasic{})
}
// 根據(jù)用戶名獲取用戶信息
func (u *UserRepository) GetByUsername(account string) (user UserBasic, err error) {
var userBasci UserBasic
if err := config.MysqlDB.Where("account = ? ", account).First(userBasci).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return userBasci, err
}
return userBasci, nil
}
// 新增數(shù)據(jù)
func (u *UserRepository) Create(user UserBasic) error {
if err := config.MysqlDB.Create(user).Error; err != nil {
return err
}
return nil
}
// 修改用戶數(shù)據(jù)
func (u *UserRepository) Updates(user UserBasic) error {
config.MysqlDB.Model(&user).Updates(&user)
return nil
}
// 刪除數(shù)據(jù)
func (u *UserRepository) Delete(id uint) error {
var user UserBasic
config.MysqlDB.Delete(&user, id)
return nil
}
注:上面代碼中的config.MysqlDB是我自己定義的數(shù)據(jù)庫鏈接對象,以后會持續(xù)分享
分析
gorm 如何實現(xiàn)orm的呢?我們來看看 gorm.Model的源碼:
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
然后,我們看看它自動創(chuàng)建的表結(jié)構(gòu)是怎樣的:
mysql> desc user_basics;
+------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| created_at | datetime(3) | YES | | NULL | |
| updated_at | datetime(3) | YES | | NULL | |
| deleted_at | datetime(3) | YES | MUL | NULL | |
| account | longtext | YES | | NULL | |
| username | longtext | YES | | NULL | |
| passwrod | longtext | YES | | NULL | |
| state | smallint(6) | YES | | NULL | |
+------------+---------------------+------+-----+---------+----------------+
通過觀察,表字段與go 的struts字段的對應關(guān)系是,表字段多單詞通過_分割
- gorm 默認根據(jù)數(shù)據(jù)庫字段命名規(guī)則與struts 的命名規(guī)則,通過反射進行映射關(guān)系。比如:CreatedAt 這個字段生成的數(shù)據(jù)庫字段是 created_at
- gorm 也可以通過 gorm:"column:數(shù)據(jù)庫字段"進行顯示映射
- ...
總結(jié)
gorm 還有很多特性,比如數(shù)據(jù)權(quán)限、事物、hook 等,大家可以自行查閱官方文檔(推介):
https://gorm.io/docs/models.html