探究ORM與GORM:簡(jiǎn)化數(shù)據(jù)庫操作的力量
在我目前正在參與的項(xiàng)目中,主要使用了Golang語言開發(fā)工程,其中涉及到很多數(shù)據(jù)庫的操作,我主要使用了GORM,在這里也推薦給大家。
在現(xiàn)代軟件開發(fā)中,與數(shù)據(jù)庫打交道是一個(gè)常見的任務(wù)。數(shù)據(jù)庫是我們存儲(chǔ)和檢索數(shù)據(jù)的關(guān)鍵工具,而訪問數(shù)據(jù)庫通常需要大量的編碼工作。但是,有一種技術(shù)可以極大地簡(jiǎn)化這個(gè)過程,那就是對(duì)象關(guān)系映射,簡(jiǎn)稱ORM。
什么是ORM?
ORM是一種編程技術(shù),它將對(duì)象和關(guān)系數(shù)據(jù)庫之間的數(shù)據(jù)映射起來。它允許開發(fā)人員使用面向?qū)ο蟮姆绞絹硖幚頂?shù)據(jù)庫操作,而不必編寫復(fù)雜的SQL查詢。ORM工具將數(shù)據(jù)庫表映射到編程語言中的對(duì)象,允許您通過操作對(duì)象來執(zhí)行數(shù)據(jù)庫操作。
ORM的好處:簡(jiǎn)化數(shù)據(jù)庫訪問、提高可移植性、減少錯(cuò)誤、提高并發(fā)等
開發(fā)人員可以使用編程語言的對(duì)象和方法來執(zhí)行數(shù)據(jù)庫操作,而不必深入了解SQL。ORM通常支持多種數(shù)據(jù)庫,使應(yīng)用程序更容易在不同的數(shù)據(jù)庫系統(tǒng)之間遷移。
golang gorm的使用
GORM的使用
GORM是一種基于Go語言的ORM庫,它提供了強(qiáng)大的數(shù)據(jù)庫訪問和查詢功能。它是Go語言社區(qū)中最受歡迎的ORM工具之一,因?yàn)樗?jiǎn)化了與數(shù)據(jù)庫的交互,并提供了豐富的功能。Gorm也是我目前我在項(xiàng)目中使用的一種ORM,也向大家推薦使用,GORM的主要功能包括:
- 模型定義:使用Go結(jié)構(gòu)體定義數(shù)據(jù)庫表模型,GORM會(huì)自動(dòng)生成數(shù)據(jù)庫表。
- 數(shù)據(jù)庫遷移:通過GORM的自動(dòng)遷移功能,您可以輕松管理數(shù)據(jù)庫模式的變化。
- 查詢構(gòu)建:GORM提供了強(qiáng)大的查詢構(gòu)建器,允許您執(zhí)行復(fù)雜的數(shù)據(jù)庫查詢,包括篩選、排序、分頁等。
- 事務(wù)管理:GORM支持事務(wù),確保數(shù)據(jù)庫操作的原子性。
舉例說明
通過Gorm創(chuàng)建數(shù)據(jù)庫,只需要定義對(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ù)庫、創(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來查找,如果不存在則插入,存在則更新
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)
}
}
總的來說,ORM和GORM的組合提供了強(qiáng)大的數(shù)據(jù)庫操作工具,使開發(fā)人員能夠更輕松地與數(shù)據(jù)庫交互,同時(shí)減少了錯(cuò)誤和提高了開發(fā)效率。
在當(dāng)今的軟件開發(fā)中,ORM和GORM已經(jīng)變得不可或缺。它們不僅簡(jiǎn)化了數(shù)據(jù)庫操作,還提供了更好的代碼組織和可維護(hù)性。無論您是剛剛?cè)腴T還是有經(jīng)驗(yàn)豐富的開發(fā)人員,了解ORM和使用GORM都將大大改善您的數(shù)據(jù)庫訪問體驗(yàn)。