探究ORM與GORM:簡(jiǎn)化數(shù)據(jù)庫(kù)操作的力量

在我目前正在參與的項(xiàng)目中,主要使用了Golang語(yǔ)言開發(fā)工程,其中涉及到很多數(shù)據(jù)庫(kù)的操作,我主要使用了GORM,在這里也推薦給大家。
在現(xiàn)代軟件開發(fā)中,與數(shù)據(jù)庫(kù)打交道是一個(gè)常見的任務(wù)。數(shù)據(jù)庫(kù)是我們存儲(chǔ)和檢索數(shù)據(jù)的關(guān)鍵工具,而訪問(wèn)數(shù)據(jù)庫(kù)通常需要大量的編碼工作。但是,有一種技術(shù)可以極大地簡(jiǎn)化這個(gè)過(guò)程,那就是對(duì)象關(guān)系映射,簡(jiǎn)稱ORM。
什么是ORM?
ORM是一種編程技術(shù),它將對(duì)象和關(guān)系數(shù)據(jù)庫(kù)之間的數(shù)據(jù)映射起來(lái)。它允許開發(fā)人員使用面向?qū)ο蟮姆绞絹?lái)處理數(shù)據(jù)庫(kù)操作,而不必編寫復(fù)雜的SQL查詢。ORM工具將數(shù)據(jù)庫(kù)表映射到編程語(yǔ)言中的對(duì)象,允許您通過(guò)操作對(duì)象來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作。
ORM的好處:簡(jiǎn)化數(shù)據(jù)庫(kù)訪問(wèn)、提高可移植性、減少錯(cuò)誤、提高并發(fā)等
開發(fā)人員可以使用編程語(yǔ)言的對(duì)象和方法來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作,而不必深入了解SQL。ORM通常支持多種數(shù)據(jù)庫(kù),使應(yīng)用程序更容易在不同的數(shù)據(jù)庫(kù)系統(tǒng)之間遷移。

golang gorm的使用
GORM的使用
GORM是一種基于Go語(yǔ)言的ORM庫(kù),它提供了強(qiáng)大的數(shù)據(jù)庫(kù)訪問(wèn)和查詢功能。它是Go語(yǔ)言社區(qū)中最受歡迎的ORM工具之一,因?yàn)樗?jiǎn)化了與數(shù)據(jù)庫(kù)的交互,并提供了豐富的功能。Gorm也是我目前我在項(xiàng)目中使用的一種ORM,也向大家推薦使用,GORM的主要功能包括:
- 模型定義:使用Go結(jié)構(gòu)體定義數(shù)據(jù)庫(kù)表模型,GORM會(huì)自動(dòng)生成數(shù)據(jù)庫(kù)表。
 - 數(shù)據(jù)庫(kù)遷移:通過(guò)GORM的自動(dòng)遷移功能,您可以輕松管理數(shù)據(jù)庫(kù)模式的變化。
 - 查詢構(gòu)建:GORM提供了強(qiáng)大的查詢構(gòu)建器,允許您執(zhí)行復(fù)雜的數(shù)據(jù)庫(kù)查詢,包括篩選、排序、分頁(yè)等。
 - 事務(wù)管理:GORM支持事務(wù),確保數(shù)據(jù)庫(kù)操作的原子性。
 
舉例說(shuō)明
通過(guò)Gorm創(chuàng)建數(shù)據(jù)庫(kù),只需要定義對(duì)應(yīng)的表即可,例如:
// FwsScenicModel 基礎(chǔ)模型
type FwsScenicModel struct {
        ID        uint `gorm:"primaryKey"`
        CreatedAt time.Time
        UpdatedAt time.Time
        DeletedAt sql.NullTime
}
// FwsSysConfigs 系統(tǒng)配置表
type FwsSysConfigs struct {
        FwsScenicModel
        Index        string `gorm:"uniqueIndex;size:255"`
        AiComUrl     string
        WxAppid      string
        WxAppSecret  string
}
// FwsSysUsers 系統(tǒng)用戶表
type FwsSysUsers struct {
        FwsScenicModel
        UserId       string
        UserName     string `gorm:"uniqueIndex;size:255"`
        UserPwd      string
        UserRealName string
        UserRoleId   string
        UserState    string
        UserDesc     string
}連接數(shù)據(jù)庫(kù)、創(chuàng)建數(shù)據(jù)表,遷移數(shù)據(jù),例如:
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
			    config.MysqlUserName, config.MysqlUserPassword, config.MysqlIP, 
          config.MysqlPort, config.MysqlDbName)
          GormDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
            Logger: logger.Default.LogMode(logger.Error), // Print SQL statements
            DisableForeignKeyConstraintWhenMigrating: true,
})
    
GormSqlDB, err = GormDB.DB()
    if err != nil {
        zap.L().Error("dbConnect", zap.Error(err))
        return
	}
GormSqlDB.SetMaxOpenConns(100) // 設(shè)置最大打開連接數(shù)
GormSqlDB.SetMaxIdleConns(20)  // 設(shè)置最大空閑連接數(shù)
GormSqlDB.SetConnMaxLifetime(time.Hour)
GormDB.AutoMigrate(&FwsSysUsers{}, &FwsSysRoles{}, &FwsSysConfigs{})操作數(shù)據(jù):
role := FwsSysRoles{
    RoleId:       "0",
    RoleFuncAuth: config.FwsFuncList,
    RoleName:     "超管",
    RoleState:    "enable",
}
// 使用FirstOrCreate來(lái)查找,如果不存在則插入,存在則更新
result := GormDB.Where(FwsSysRoles{RoleId: role.RoleId}).FirstOrCreate(&role)
if result.Error == nil {
    if result.RowsAffected == 0 { // 返回插入記錄的條數(shù)
        updates := map[string]interface{}{
          "role_func_auth": config.FwsFuncList, // 設(shè)置要更新的字段
        }
        GormDB.Model(&FwsSysRoles{}).
        Where(FwsSysRoles{RoleId: role.RoleId}).Updates(updates)
  }
}總的來(lái)說(shuō),ORM和GORM的組合提供了強(qiáng)大的數(shù)據(jù)庫(kù)操作工具,使開發(fā)人員能夠更輕松地與數(shù)據(jù)庫(kù)交互,同時(shí)減少了錯(cuò)誤和提高了開發(fā)效率。
在當(dāng)今的軟件開發(fā)中,ORM和GORM已經(jīng)變得不可或缺。它們不僅簡(jiǎn)化了數(shù)據(jù)庫(kù)操作,還提供了更好的代碼組織和可維護(hù)性。無(wú)論您是剛剛?cè)腴T還是有經(jīng)驗(yàn)豐富的開發(fā)人員,了解ORM和使用GORM都將大大改善您的數(shù)據(jù)庫(kù)訪問(wèn)體驗(yàn)。















 
 
 







 
 
 
 