gorm基本使用

前言

在開發(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 中,有mybatiesmybaties 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容