ä¸ÂãÂÂåºæ¬ä»Âç»ÂÃ¥ÂÂæ»ç»ÂæÂÂè·¯
1.Gormç®Âä»Âï¼Â
Gormæ¯Goè¯Âè¨ÂçÂÂå¼Â溠ORMï¼Â对象堳系æ å°Âï¼Âæ¡Âæ¶ï¼ÂORMæ¡Âæ¶ç¨äºÂ帮å©å¤ÂçÂÂ堳系åÂÂæ°æ®åºÂçÂÂæÂÂä½Âï¼ÂæÂÂä¾Âä¸Âç§Âé¢åÂÂ对象çÂÂç¼Âç¨Âæ¹å¼Âï¼Âç®ÂÃ¥ÂÂæ°æ®åºÂæÂÂä½ÂÃ¥ÂÂæ°æ®模åÂÂ管çÂÂçÂÂè¿Âç¨Âï¼ÂGormæ¡Âæ¶è½å¤ÂéÂÂè¿ÂGoè¯Âè¨Âç»ÂæÂÂä½ÂæÂ¥å®Âä¹Âæ°æ®åºÂ模åÂÂï¼Âå®Âèªå¨å¤ÂçÂÂäºÂæ°æ®åºÂ表åÂÂç»ÂæÂÂä½Âä¹Âé´çÂÂæ å°Âï¼Âå Â许éÂÂè¿ÂæÂÂä½Âç»ÂæÂÂä½ÂæÂ¥è¿Âè¡Âæ°æ®æ¥询ãÂÂæÂÂå ¥ãÂÂæ´æ°åÂÂå é¤çÂÂæÂÂä½Âï¼ÂèÂÂæ éÂÂç´æÂ¥ç¼ÂÃ¥ÂÂSQLè¯Âå¥ï¼Â
- GormæÂÂä¾ÂäºÂ强大çÂÂæ¥询æÂÂ建å¨ï¼Âå¯以使ç¨é¾å¼Âæ¹æ³ÂæÂÂ建å¤ÂæÂÂçÂÂæ°æ®åºÂæ¥询ï¼Â
- æ¯æÂÂäºÂå¡ï¼Âå¯以使ç¨GormæÂÂä¾ÂçÂÂäºÂå¡管çÂÂÃ¥ÂÂè½æÂ¥ä¿Âè¯Âæ°æ®åºÂæÂÂä½ÂçÂÂÃ¥ÂÂÃ¥ÂÂæ§åÂÂä¸Âè´æ§ãÂÂ
- Gormæ¯æÂÂæ°æ®åºÂè¿Â移ï¼Âå¯以èªå¨åÂÂ建æÂÂæ´æ°æ°æ®åºÂç»ÂæÂÂï¼ÂèÂÂä¸ÂéÂÂè¦ÂæÂÂå¨ç¼Âå SQL èÂÂæ‹ÂÂ
- å¯以å®Âä¹Âå¨模åÂÂä¸Âæ§è¡ÂçÂÂé©åÂÂå½æ°ï¼Âç¨äºÂå¨ä¿ÂÃ¥ÂÂãÂÂæ´æ°ãÂÂå é¤çÂÂæÂÂä½ÂÃ¥ÂÂÃ¥ÂÂæ§è¡Âç¹å®ÂçÂÂé»è¾Âï¼Âå®Âç°类似触åÂÂå¨çÂÂÃ¥ÂÂè½ãÂÂ
2.æ»ç»ÂæÂÂè·¯ï¼Â
éÂÂè¿Âè¿ÂæÂÂ¥MySQLæ°æ®åºÂï¼Â对ä¸Â个Student表åÂÂGrade表åÂÂå«è¿Âè¡Âæ°æ®çÂÂå¢Âå æÂ¥æ¹以åÂÂå®Âä¹ÂäºÂå¡ãÂÂé©åÂÂå½æ°çÂÂæÂÂä½ÂçÂÂæÂÂGormè¯Âæ³Âï¼Â并使ç¨Navicatï¼Âæ°æ®åºÂå¯è§ÂÃ¥ÂÂ工堷ï¼ÂéªÂè¯Âæ»ç»ÂGormçÂÂæ°æ®æÂÂä½Âç¹æ§ï¼Âå¨课ç¨ÂçÂÂåºç¡Âä¸Âè¿Âä¸ÂæÂ¥äºÂ解ç»ÂèÂÂï¼Âæ»ç»ÂGormçÂÂåºæ¨æ³Âï¼Âæ»ç»Âå¨项ç®å®ÂæÂÂä¸ÂGormçÂÂ注æÂÂäºÂ项ï¼ÂéÂÂè¿Âä¸Âå ¶ä»ÂORMæ¡Âæ¶æ¯Âè¾Âå¦习深堥äºÂ解GormçÂÂä¼Â缺ç¹ï¼Â以ä¾ÂæÂ¥åÂÂå¤Âä¹ å¼ÂÃ¥ÂÂãÂÂ
äºÂãÂÂæ°æ®æÂÂä½Â
1.æ°æ®åºÂè¿ÂæÂ¥ï¼Â
GorméÂÂè¿Â驱å¨è¿ÂæÂ¥æ°æ®åºÂï¼Âè¿Âæ¥忠须使ç¨DSNæ ¼å¼Âï¼ÂDSNæ¯ä¸Âç§Âç¨äºÂæÂÂå®Âæ°æ®åºÂè¿Âæ¥信æ¯çÂÂÃ¥ÂÂ符串格å¼Âï¼ÂéÂÂ常ç¨äºÂå¨åºÂç¨ç¨ÂåºÂä¸Âé Âç½®åÂÂä¼ éÂÂæ°æ®åºÂè¿ÂæÂ¥åÂÂæ°ï¼Â以便建ç«Âä¸Âæ°æ®åºÂçÂÂè¿ÂæÂ¥ï¼ÂDSNå å«äºÂè¿ÂæÂ¥æ°æ®åºÂæÂÂéÂÂçÂÂÃ¥ÂÂç§Âä¿¡æ¯ï¼Âå¦Âæ°æ®åºÂç±»åÂÂãÂÂ主æºå°åÂÂãÂÂ端å£ãÂÂç¨æ·åÂÂãÂÂå¯Âç ÂãÂÂæ°æ®åºÂÃ¥ÂÂ称çÂÂï¼Âå ·ä½Âç DSN æ ¼å¼ÂÃ¥ÂÂÃ¥ÂÂæ°åÂÂå³äºÂæÂÂ使ç¨çÂÂæ°æ®åºÂç±»åÂÂÃ¥ÂÂç¸åºÂçÂÂæ°æ®åºÂ驱å¨ï¼ÂGormæ¯æÂÂMySQLãÂÂSQL severï¼Âpostgresqlï¼ÂSqliteï¼Âå ¶ä»Âæ°æ®åºÂå¯以å¤Âç¨æÂÂèªè¡Âå¼ÂÃ¥ÂÂ驱å¨ï¼Â
Gormè¿ÂæÂ¥æ°æ®åºÂæ¯æÂÂå¾Âå¤Âèªå®Âä¹Âé Âç½®ï¼Âå å«å¼Âå¯堳éÂÂé»Â认äºÂå¡ï¼Âç¼ÂÃ¥ÂÂé¢Âç¼Âè¯Âè¯Âå¥ï¼Âå¯ç¨æÂ¥å¿Âè¾Âåºï¼Âæ°æ®åºÂè¿Âæ¥池é Âç½®ï¼Âèªå¨è¿Â移é Âç½®ï¼Âé©åÂÂå½æ°é Âç½®ï¼Â表åÂÂÃ¥ÂÂÃ¥ÂÂæ å°Âé Âç½®çÂÂï¼Â
示ä¾Âï¼Â
//è¿ÂæÂ¥æ°æ®åºÂ
dsn := "root:123456@tcp(localhost:3307)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(
mysql.Open(dsn), //æ ¹æ®ä¸ÂÃ¥ÂÂ驱å¨æ¯æÂÂä¸ÂÃ¥ÂÂæ°æ®åºÂï¼Âdsnæ ¼å¼Âï¼Âç¼Âç Âæ ¼å¼ÂÃ¥ÂÂæ¶åº
&gorm.Config{
Logger: logger.Default.LogMode(logger.Info), // å¯ç¨æÂ¥å¿Âè¾Âåºï¼Âè¾ÂåºåÂÂ
å«SQLæ¥询è¯ÂÃ¥ÂÂ¥
SkipDefaultTransaction: true, //Ã¥Â
³éÂÂé»Â认äºÂå¡
PrepareStmt: true, //ç¼ÂÃ¥ÂÂé¢Âç¼Âè¯Âè¯ÂÃ¥ÂÂ¥
}) //ä¼ éÂÂèªå®Âä¹ÂéÂ
Âç½®
if err != nil {
panic("failed")
}
2.modelå®Âä¹Âï¼Â
GorméÂÂè¿Âå®Âä¹Âç»ÂæÂÂä½ÂæÂ¥å®Âä¹ÂGorm modelï¼ÂÃ¥ÂÂæ¶éÂÂè¿Âå®Âç°TableName
æÂ¥å£æ¥为modelå®Âä¹Â表åÂÂï¼Âå¦ÂæÂÂä¸Âå®Âä¹Â表åÂÂç´æ¥使ç¨ç»ÂæÂÂä½ÂÃ¥ÂÂè¿Âè¡ÂæÂÂä½Âï¼ÂÃ¥ÂÂå¨åÂÂ建æ°æ®åºÂ表æ¶ï¼ÂæÂÂçÂ
§GormçÂÂ约å®Â表åÂÂéÂÂè¦Â使ç¨ç»ÂæÂÂä½ÂÃ¥ÂÂ+sï¼Âå¦åÂÂä¼Âå¨æÂÂä½Â表æ¶æÂ¥éÂÂæ°æ®åºÂä¸Âä¸ÂÃ¥ÂÂå¨表ï¼Â
å¨å®Âä¹ÂGorm modelæ¶å¯以使ç¨åÂÂç§Âæ Âç¾ï¼Âtagsï¼ÂÃ¥ÂÂæ¹æ³Âæ¥为模åÂÂæ·»å ä¸ÂÃ¥ÂÂçÂÂæÂÂä½ÂÃ¥ÂÂÃ¥ÂÂè½ï¼Â
- 表åÂÂÃ¥ÂÂÃ¥ÂÂÃ¥ÂÂæ å°Âï¼Â使ç¨
gorm:"column:name"
æ Âç¾æÂ¥æ å°Â模åÂÂÃ¥ÂÂ段å°æ°æ®åºÂ表çÂÂÃ¥ÂÂÃ¥ÂÂï¼ - 主é®设置ï¼Â使ç¨
gorm:"primaryKey"
æ Âç¾æÂ¥æÂÂå®Â主é®åÂÂ段@- èªå¢ÂÃ¥ÂÂ段ï¼Â使ç¨
gorm:"autoIncrement"
æ Âç¾æÂ¥æÂÂå®Âèªå¢ÂÃ¥ÂÂ段@- å¯ä¸Âç´¢å¼Âï¼Â使ç¨
gorm:"unique"
æ Âç¾æ¥为åÂÂ段添å å¯ä¸Âç´¢å¼Âï¼ - é»Â认å¼ï¼Â使ç¨
gorm:"default:value"
æ Âç¾æ¥为åÂÂ段æÂÂå®Âé»Â认å¼@- Ã¥Â
³èÂÂÃ¥Â
³ç³»ï¼Â使ç¨
gorm:"foreignKey"
ãÂÂgorm:"references"
Ã¥ÂÂå ¶ä»Âå ³èÂÂ堳系æ Âç¾æÂ¥å®Âä¹Â模åÂÂä¹Âé´çÂÂå ³èÂÂ堳系@- èªå®Âä¹Âæ¹æ³Âï¼Âä½ å¯以å¨模åÂÂä¸Âå®Âä¹Âèª己çÂÂæ¹æ³Âï¼Âç¨äºÂæ§è¡Âç¹å®ÂçÂÂæ°æ®åºÂæÂÂä½ÂæÂÂä¸Âå¡é»è¾Âï¼Â
- æ¥询ä½Âç¨åÂÂï¼Â使ç¨
scope
æ¹æ³ÂÃ¥ÂÂ建æ¥询ä½Âç¨åÂÂï¼Â以便å¨æ¥询ä¸Âå¤Âç¨ç¹å®ÂçÂÂæ¡件@- 忽çÂ¥åÂÂ段ï¼Â使ç¨
gorm:"-"
æ Âç¾æ¥忽ç¥模åÂÂä¸ÂçÂÂæÂÂäºÂÃ¥ÂÂ段ï¼Â使堶ä¸ÂÃ¥ÂÂä¸Âæ°æ®åºÂæÂÂä½Âï¼ - 表åÂÂ设置ï¼Â使ç¨
gorm:"tableName"
æ Âç¾æÂ¥æÂÂå®Âæ°æ®åºÂ表çÂÂÃ¥ÂÂ称@- 软å é¤设置ï¼Â使ç¨
Deleted gorm.DeletedAt
æ Âå¿ÂÃ¥ÂÂ段ï¼Â表示对该模åÂÂè¿Âè¡Âå é¤æÂÂä½Âæ¶ï¼Âä¸Âç´æÂ¥è¿Âè¡Âç©çÂÂå é¤ï¼Âå é¤æ¶并ä¸Âä¼Âä»Âæ°æ®åºÂä¸Â移é¤æ°æ®记å½Âï¼ÂèÂÂæ¯å¨记å½Âä¸Âæ·»å ä¸Â个æ Âå¿ÂÃ¥ÂÂ段ï¼Âdeleted_at
ï¼Âï¼Â表示该记å½Â已被å é¤ï¼Âå¨æ¥询æ¶ä¸ÂèÂÂæ¥询è¯Âå¥ä¼Âç´æ¥忽ç¥软å é¤çÂÂæ°æ®è¿Âè¡Âæ¥询ï¼ÂÃ¥ÂÂæ¶ä¹Âå¯以使ç¨Unscoped
ä¸Â忽ç¥软å é¤æ°æ®è¿Âè¡Âæ¥询@- ç»ÂæÂÂä½ÂåµÂå¥Âï¼ÂéÂÂè¿Âå¨模åÂÂä¸ÂåµÂå¥Âå ¶ä»Âç»ÂæÂÂä½Âæ¥表示æ´å¤ÂæÂÂçÂÂæ°æ®åºÂ堳系ãÂÂ
type Student struct {
ID uint `gorm:"primaryKey" gorm:"autoIncrement" `
Name12 string `gorm:"column:name"`
Age uint `gorm:"column:age"`
Dream string `gorm:"default:bytedance"`
}
// TableName 为modelå®Âä¹Â表åÂÂï¼ÂæÂ¥å£è¿ÂÃ¥ÂÂ表åÂÂ
func (s Student) TableName() string {
return "student"
}
type Grade struct {
ID uint `gorm:"primaryKey" gorm:"autoIncrement" `
StudentID uint
Num uint
Student Student `gorm:"foreignKey:StudentID"` //å®Âä¹ÂÃ¥Â
³èÂÂçÂÂStudent模åÂÂ
}
3.æ°æ®åÂÂ建ï¼Â
主è¦Â使ç¨å½æ°ï¼Â
Create
å½æ°ï¼Âç¨äºÂÃ¥ÂÂ建æ°çÂÂæ°æ®记å½Âï¼ÂéÂÂè¦Â使ç¨æÂÂéÂÂä¼ éÂÂï¼ÂSave
å½æ°ï¼Âç¨äºÂÃ¥ÂÂ建æÂÂæ´æ°æ°æ®记å½Âï¼Âæ ¹æ®主é®ï¼ÂæÂÂå¯ä¸Âç´¢å¼Âï¼Âæ¯å¦åÂÂå¨æÂ¥å³å®ÂæÂÂä½Âï¼ÂFirstOrCreate
å½æ°ï¼ÂæÂ¥æ¾第ä¸Âæ¡满足æ¡件çÂÂè®°å½Âï¼Âå¦ÂæÂÂä¸ÂÃ¥ÂÂå¨åÂÂÃ¥ÂÂ建ï¼Â
Ã¥ÂÂæ¡æ°æ®åÂÂ建ï¼Â
//Ã¥ÂÂ建ä¸Âæ¡
s := &Student{Name12: "Alic", Age: 18}
res := db.Create(s) //ä¼ éÂÂç»ÂæÂÂä½Âï¼Âé¾å¼Âè°Âç¨ï¼Âè¿ÂÃ¥ÂÂ对象
fmt.Println(res.Error) //è·åÂÂerrorï¼Âç¨é¾å¼Âè°Âç¨è¿ÂÃ¥ÂÂçÂÂ对象è·åÂÂ
fmt.Println(s.ID) //è¿ÂÃ¥ÂÂæÂÂÃ¥Â
¥æ°æ®çÂÂ主é®ï¼Âèªå¢Â
g := &Grade{StudentID: s.ID, Num: 95}
res = db.Create(g)
fmt.Println(res.Error)
fmt.Println(g.ID)
s = &Student{ID: 2, Name12: "John", Age: 22}
res = db.Save(s)
fmt.Println(res.Error)
fmt.Println(s.ID)
//ä¸Âå²çªÂÃ¥ÂÂ建æ°æ®
s2 := &Student{Name12: "pp", ID: 1}
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&s2) //使ç¨clause.OnConflictå¤ÂçÂÂå²çªÂæ°æ®
å¤Âæ¡æ°æ®åÂÂ建ï¼Â
//Ã¥ÂÂ建å¤Âæ¡
students := []*Student{{Name12: "aa", Age: 18}, {Name12: "bb", Age: 20}, {Name12: "cc", Age: 22}}
res := db.Create(students)
fmt.Println(res.Error)
for _, p := range students {
fmt.Println(p.ID)
}
4.æ°æ®æ¥询ï¼Â
主è¦Â使ç¨å½æ°ï¼Â
Find
å½æ°ï¼Âç¨äºÂæ¥询满足æ¡件çÂÂå¤Âæ¡æ°æ®记å½Âï¼Âæ¥询ä¸Âå°æ°æ®ä¸Âè¿ÂÃ¥ÂÂéÂÂ误ï¼ÂFirst
å½æ°ï¼Âç¨äºÂæ¥询满足æ¡件çÂÂ第ä¸Âæ¡æ°æ®记å½Âï¼Âæ¥询ä¸Âå°æ°æ®åÂÂè¿ÂÃ¥ÂÂErrRecordNotFound容æÂÂé æÂÂ线ä¸Âé®é¢Âï¼Âæ¢ç¨whereï¼Âæªæ¾å°è¿ÂÃ¥ÂÂ空æ°ç»Âï¼ÂTake
å½æ°ï¼Âç¨äºÂéÂÂæºè·åÂÂä¸Âæ¡æ°æ®记å½Âï¼ÂWhere
å½æ°ï¼Âç¨äºÂæ·»å æ¡件æ¥询ï¼ÂOrder
å½æ°ï¼Âç¨äºÂæÂÂå®Âæ¥询ç»ÂæÂÂçÂÂæÂÂåºÂæ¹å¼Âï¼ÂLimit
å½æ°ï¼Âç¨äºÂéÂÂå¶æ¥询ç»ÂæÂÂçÂÂæ°éÂÂï¼ÂOffset
å½æ°ï¼Âç¨äºÂ设置æ¥询ç»ÂæÂÂçÂÂÃ¥ÂÂ移éÂÂï¼ÂSelect
å½æ°ï¼Âç¨äºÂéÂÂæ©è¦Âæ¥询çÂÂÃ¥ÂÂ段ï¼ÂJoins
å½æ°ï¼Âç¨äºÂå ³èÂÂæ¥询ãÂÂ
Find
Ã¥ÂÂFirst
è·åÂÂ第ä¸Âæ¡记å½Âï¼Â
å¤Âæ¡æ°æ®åÂÂå¤ÂÃ¥ÂÂæ¡件æ¥询ï¼Â
student := make([]*Student, 0)
//SELECT * FROM `student` WHERE age>18
result := db.Where("age>18").Find(&student) //é¾å¼Âè°Âç¨è¿ÂÃ¥ÂÂ对象æÂÂå°è°Âè¯Âä¿¡æ¯
fmt.Println(result.RowsAffected) //è¿ÂÃ¥ÂÂæ¾å°çÂÂè®°å½Âæ°ï¼Âç¸å½ÂäºÂlen(users)
fmt.Println(result.Error) //returns error
//SELECT * FROM `student` WHERE name IN ('Alic','John')
db.Where("name IN ?", []string{"Alic", "John"}).Find(&student)
//SELECT * FROM `student` WHERE name LIKE '%Y%'
db.Where("name LIKE ?", "%Y%").Find(&student)
//SELECT * FROM `student` WHERE name='Alic' AND age>='18'
db.Where("name=? AND age>=?", "Alic", "18").Find(&student)
ç»ÂæÂÂä½Âä¼ éÂÂÃ¥ÂÂmapä¼ éÂÂæ¥询çÂÂé¶å¼å¤ÂçÂÂåºå«ï¼Â
èÂÂ表æ¥询ï¼Â
æ¥询æÂÂ绩大äºÂ90çÂÂå¦çÂÂï¼Â
//èÂÂ表æ¥询
var list []struct {
Student
Grade
}
result := db.Table("student").
Select("student.*, grades.*").
Joins("INNER JOIN grades ON student.id = grades.sid").
Where("grades.grade > ?", 90).
Find(&list)
if result.Error != nil {
panic("æ æ³Âæ¥询æ°æ®")
}
fmt.Println("æÂÂ绩大äºÂ90çÂÂå¦çÂÂï¼Â")
for _, record := range list {
fmt.Println("å¦çÂÂå§ÂÃ¥ÂÂ:", record.Name12)
fmt.Println("å¹´é¾Â:", record.Age)
fmt.Println("æÂÂ绩:", record.Num)
}
5.æ°æ®æ´æ°ï¼Â
主è¦Â使ç¨å½æ°ï¼Â
Model
å½æ° +Update
å½æ°ï¼ÂéÂÂè¿ÂModel
å½æ°æÂÂå®Â表åÂÂÃ¥ÂÂæ¡件ï¼Âç¶åÂÂ使ç¨Update
å½æ°æ´æ°åÂÂÃ¥ÂÂæ°æ®ï¼ÂUpdates
å½æ°ï¼Âæ´æ°å¤ÂÃ¥ÂÂæ°æ®ï¼Â使ç¨ç»ÂæÂÂä½Âæ´æ°æ¶åªä¼Âæ´æ°éÂÂé¶å¼ï¼Âå¦ÂæÂÂè¦Âæ´æ°é¶å¼éÂÂè¦Â使ç¨mapä¼ éÂÂæÂÂè ç¨Select
éÂÂæ©åÂÂ段ï¼ÂSave
å½æ°ï¼Âç¨äºÂÃ¥ÂÂ建æÂÂæ´æ°æ°æ®记å½Âï¼Âæ ¹æ®主é®ï¼ÂæÂÂå¯ä¸Âç´¢å¼Âï¼Âæ¯å¦åÂÂå¨æÂ¥å³å®ÂæÂÂä½Âï¼ÂUpdatesColumns
å½æ°ï¼Âç¨äºÂæ´æ°æÂÂå®ÂÃ¥ÂÂçÂÂæ°æ®记å½ÂãÂÂ
æ´æ°åÂÂÃ¥ÂÂæ°æ®ï¼Â
æ´æ°å¤ÂÃ¥ÂÂæ°æ®ï¼Â
//æ´æ°å¤Â个åÂÂ
//æ ¹æ®structæ´æ°å±Âæ§ãÂÂåªä¼Âæ´æ°éÂÂé¶å¼çÂÂÃ¥ÂÂ段
//UPDATE `student` SET `name`='Henry',`age`=18 WHERE `id` = 4
db.Model(&Student{ID: 4}).Updates(Student{Name12: "Henry", Age: 18}) //åªæ´æ°éÂÂé¶å¼
//æ ¹æ®mapæ´æ°å±Âæ§
//UPDATE `student` SET `age`=18,`name`='Lucy' WHERE `id` = 5
db.Model(&Student{ID: 5}).Updates(map[string]interface{}{"name": "Lucy", "age": 18}) //é¶å¼å¤ÂçÂÂ
//æ´æ°éÂÂå®ÂÃ¥ÂÂ段
//UPDATE `student` SET `name`='hello' WHERE `id` = 6
db.Model(&Student{ID: 6}).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
//sql表达å¼Âæ´æ°
//UPDATE `student` SET `age`=age * 2 +100 WHERE `id` = 7
db.Model(&Student{ID: 7}).Update("age", gorm.Expr("age * ? +?", 2, 100))
6.æ°æ®å é¤ï¼Â
主è¦Â使ç¨å½æ°ï¼Â
Deleted gorm.DeletedAt
æ Âå¿ÂÃ¥ÂÂ段ï¼Â设置模åÂÂå é¤模å¼Â为软å é¤ï¼ÂDelete
å½æ°ï¼Âç¨äºÂå é¤æ°æ®记å½Âï¼ÂWhere
å½æ° +Delete
å½æ°ï¼Â使ç¨Where
å½æ°æÂÂå®Âå é¤çÂÂæ¡件ï¼Âç¶åÂÂè°Âç¨Delete
å½æ°å é¤æ°æ®ï¼ÂUnscoped
å½æ° +Delete
å½æ°ï¼Â使ç¨Unscoped
å½æ°å é¤å æ¬软å é¤å¨å çÂÂè®°å½Âï¼ÂModel
å½æ° +Where
å½æ° +Delete
å½æ°ï¼ÂéÂÂè¿ÂModel
å½æ°æÂÂå®Â模åÂÂÃ¥ÂÂæ¡件ï¼Âç¶åÂÂ使ç¨Delete
å½æ°å é¤æ°æ®ãÂÂ
ç©çÂÂå é¤ï¼Â
//ç©çÂÂå é¤
db.Delete(&Student{}, 10) //DELETE FROM `student` WHERE `student`.`id` = 10
db.Delete(&Student{}, "11") //DELETE FROM `student` WHERE `student`.`id` = '11'
db.Delete(&Student{}, []int{1, 2, 3}) //DELETE FROM `student` WHERE `student`.`id` IN (1,2,3)
db.Where("name LIKE ?", "%he%").Delete(Student{}) // DELETE FROM `student` WHERE name LIKE '%he%'
db.Delete(Student{}, "name LIKE ?", "%Y%") //DELETE FROM `student` WHERE name LIKE '%Y%'
软å é¤ï¼Â
注æÂÂæ¤æ¶éÂÂè¦Âå¨æ°æ®åºÂ表ä¸Âå¢Âå deleted
Ã¥ÂÂ段ï¼Âç±»åÂÂ为TIMESTAMP
ï¼Âç¨äºÂä¿ÂÃ¥ÂÂdelete_at
软å é¤æ¶é´ï¼Âä½Â为软å é¤çÂÂæ Âå¿Âï¼Â没æÂÂ该åÂÂ段ä¼ÂæÂ¥éÂÂï¼Â
type Student struct {
ID uint `gorm:"primaryKey" gorm:"autoIncrement" `
Name12 string `gorm:"column:name"`
Age uint `gorm:"column:age"`
Dream string `gorm:"default:bytedance"`
Deleted gorm.DeletedAt //ç¨äºÂ软åÂÂ
}
//软å é¤,æ®éÂÂæ¥询ä¼Â忽ç¥软å æ°æ®
//å é¤ä¸Âæ¡
s2 := Student{ID: 15}
db.Delete(&s2)
//æ¹éÂÂÃ¥ÂÂ
db.Where("age = ?", 21).Delete(&Student{})
students := make([]*Student, 0)
//忽ç¥软å æ°æ®æ¥询
db.Where("age>20").Find(&students)
for _, record := range students {
fmt.Println(record.ID, record.Name12, record.Age)
}
//ä¸Â忽ç¥软å æ°æ®æ¥询
db.Unscoped().Where("age>20").Find(&students)
for _, record := range students {
fmt.Println(record.ID, record.Name12, record.Age)
}
//æÂ¥æÂÂ软å è½åÂÂçÂÂmodelè°Âç¨deleteæ¶记å½Âä¸Âä¼Âå¨æ°æ®åºÂçÂÂæ£çÂÂå é¤ï¼Âä½Âgormä¼ÂæÂÂdeleteat设置为å½ÂÃ¥ÂÂæ¶é´ï¼Â并ä¸Âä¸Âè½åÂÂéÂÂè¿Âæ£常çÂÂæ¥询æ¹æ³Âæ¾å°该记å½Â
//使ç¨unscopedå¯以æ¥询被软å çÂÂæ°æ®
7.äºÂå¡ï¼Â
主è¦Â使ç¨å½æ°ï¼Â
Begin
å½æ°ï¼Âç¨äºÂå¼Âå§Âä¸Â个äºÂå¡ï¼ÂCommit
å½æ°ï¼Âç¨äºÂæÂÂ交äºÂå¡ï¼Âå°ÂæÂÂä½Â永习ä¿ÂÃ¥ÂÂå°æ°æ®åºÂï¼ÂRollback
å½æ°ï¼Âç¨äºÂÃ¥ÂÂæ»ÂäºÂå¡ï¼ÂÃ¥ÂÂæ¶Âä¹ÂÃ¥ÂÂçÂÂæÂÂä½Âï¼ÂTransaction
å½æ°ï¼Âæ§è¡ÂäºÂå¡æÂÂä½ÂãÂÂå¨è¿Â个å½æ°ä¸Âæ§è¡Âæ°æ®åºÂæÂÂä½Âï¼Â并根æ®æ¯Â个æÂÂä½ÂçÂÂéÂÂ误æ åµæÂ¥å³å®Âæ¯å¦æÂÂ交äºÂå¡æÂÂÃ¥ÂÂæ»ÂäºÂå¡ãÂÂå¦ÂæÂÂè¿ÂÃ¥ÂÂçÂÂéÂÂ误为 nilï¼ÂäºÂå¡å°Â被æÂÂ交ï¼Âå¦ÂæÂÂè¿ÂÃ¥ÂÂçÂÂéÂÂ误ä¸Â为 nilï¼ÂäºÂå¡å°Â被åÂÂæ»Âï¼Âç¨äºÂèªå¨æÂÂ交äºÂå¡ï¼Âé¿å Âæ¼ÂÃ¥ÂÂCommit
Ã¥ÂÂRollback
ãÂÂ
æ®éÂÂäºÂå¡ï¼Â
//æ°æ®ä¸Âè´æ§è¦Âæ±Â
tx := db.Begin() //å¼Âå§ÂäºÂå¡
//å¨äºÂå¡ä¸Âæ§è¡Âä¸ÂäºÂdbæÂÂä½Âï¼Âä»Âè¿ÂéÂÂå¼Âå§Âï¼ÂåºÂ该使ç¨txèÂÂä¸Âæ¯dbï¼Â
if err = tx.Create(&Student{Name12: "name1", Age: 23}).Error; err != nil {
tx.Rollback() //éÂÂå°éÂÂ误åÂÂæ»ÂäºÂå¡
return
}
if err = tx.Create(&Student{Name12: "name2", Age: 25}).Error; err != nil {
tx.Rollback() //éÂÂå°éÂÂ误åÂÂæ»ÂäºÂå¡
return
}
tx.Commit() //æÂÂ交äºÂå¡
使ç¨Transaction
çÂÂäºÂå¡ï¼Â
//æÂÂä¾ÂäºÂtransactionæ¹æ³Âç¨äºÂèªå¨æÂÂ交äºÂå¡
if err = db.Transaction(func(tx *gorm.DB) error {
if err = tx.Create(&Student{Name12: "name3", Age: 22}).Error; err != nil {
return err
}
if err = tx.Create(&Student{Name12: "name4", Age: 21}).Error; err != nil {
return err
}
return nil
}); err != nil {
return
}
8.é©åÂÂå½æ°ï¼Â
Gorm æÂÂä¾Âä¸Âç³»åÂÂçÂÂé©åÂÂå½æ°ï¼ÂHook Functionsï¼Âï¼Âå¯以å¨æ§è¡Âæ°æ®åºÂæÂÂä½ÂçÂÂä¸ÂÃ¥ÂÂé¶段æÂÂÃ¥Â
¥èªå®Âä¹ÂçÂÂé»è¾Âï¼Âè¿ÂäºÂé©åÂÂå½æ°åÂ
Â许å¨åÂÂ建ãÂÂæ´æ°ãÂÂå é¤çÂÂæ°æ®åºÂæÂÂä½Âä¹ÂÃ¥ÂÂæÂÂä¹ÂÃ¥ÂÂæ§è¡Âä¸ÂäºÂé¢Âå¤ÂçÂÂæÂÂä½Âï¼Âä¾Âå¦ÂéªÂè¯ÂãÂÂ审计ãÂÂæÂ¥å¿Âè®°å½ÂãÂÂ触åÂÂå¨çÂÂï¼Âå½åÂÂä¸Âè¬为æÂÂä½ÂÃ¥ÂÂÃ¥ÂÂå BeforeæÂÂAfterï¼Âå¦ÂBeforeCreate
ãÂÂAfterUpdate
;
æµÂè¯Âå®Âä¹ÂBeforeCreate
ç¨äºÂå¨åÂÂ建æ°æ®ä¹ÂÃ¥ÂÂæ£ÂæÂÂ¥ageæ¯å¦大äºÂ10ï¼Âå°ÂäºÂ10Ã¥ÂÂæ»Âè¿ÂÃ¥ÂÂéÂÂ误ï¼Â大äºÂÃ¥ÂÂæ£常åÂÂ建ï¼Âå®Âä¹ÂAfterCreate
ç¨äºÂÃ¥ÂÂ建ä¸Âæ¡Studentè®°å½ÂÃ¥ÂÂèªå¨åÂÂ建ä¸Âæ¡æÂÂ绩为0çÂÂæÂÂ绩åÂÂ段ï¼Â类似触åÂÂå¨å®Âç°ï¼Â
func (s *Student) BeforeCreate(tx *gorm.DB) (err error) {
if s.Age < 0 {
return errors.New("the age should be greater than 10")
}
return
}
func (s *Student) AfterCreate(tx *gorm.DB) (err error) {
return tx.Create(&Grade{StudentID: s.ID, Num: 0}).Error
}
9.æ´å¤Âæ¯æÂÂæÂÂä½Âï¼Â
é¤äºÂä¸Â述常ç¨æÂÂä½Âå¤Âï¼ÂGormè¿Âæ¯æÂÂçÂÂæÂÂä½ÂæÂÂï¼Â
-
模åÂÂå ³èÂÂæÂÂä½Âï¼Â
- ä¸Â对ä¸ÂÃ¥Â
³èÂÂï¼Â
HasOne
ãÂÂBelongsTo
ï¼ - ä¸Â对å¤ÂÃ¥Â
³èÂÂï¼Â
HasMany
ãÂÂBelongsToMany
ï¼ - å¤Â对å¤ÂÃ¥Â
³èÂÂï¼Â
ManyToMany
ï¼Â
- ä¸Â对ä¸ÂÃ¥Â
³èÂÂï¼Â
-
æ°æ®åºÂè¿Â移æÂÂä½Âï¼Â
- Ã¥ÂÂ建表ï¼Â
AutoMigrate
ãÂÂMigrator
ï¼ - ä¿®æ¹表ç»ÂæÂÂï¼Âæ·»å ãÂÂä¿®æ¹ãÂÂå é¤åÂÂ段ï¼Â
- å é¤表ï¼Â
DropTable
ï¼Â
- Ã¥ÂÂ建表ï¼Â
-
æ¥询æÂÂ建å¨æÂÂä½Âï¼Â
- æÂÂåºÂï¼Â
Order
ï¼ - Ã¥ÂÂ页ï¼Â
Limit
ãÂÂOffset
ï¼ - èÂÂÃ¥ÂÂå½æ°ï¼Â
Count
ãÂÂSum
ãÂÂMin
ãÂÂMax
ãÂÂAvg
ï¼ - Ã¥ÂÂç SQL æ¥询ï¼Â
Raw
ï¼Â
- æÂÂåºÂï¼Â
ä¸ÂãÂÂ对æ¯ÂMyBatis
对æ¯ÂJava常ç¨çÂÂMyBatisæ¡Âæ¶ï¼ÂGormçÂÂ使ç¨ä¼Âæ´å ç®ÂæÂÂï¼Âç´æ¥使ç¨dsnå°±å¯以ç´æÂ¥è¿ÂæÂ¥æ°æ®åºÂï¼ÂæÂÂä¾Âèªå¨æ å°Âï¼Âè¿Âå¯以è¿Âè¡Âå¾Âå¤Âèªå®Âä¹Â设置ï¼ÂMyBatisÃ¥ÂÂéÂÂè¦Â使ç¨XMLæÂÂ注解æÂÂå®Âï¼ÂéÂÂè¦Âè¿Âè¡ÂæÂÂå¨æ å°Âï¼Â
Gormä¼Âæ´å æ¯æÂÂ使ç¨æ¡Âæ¶设置çÂÂå½æ°è¿Âè¡Âæ°æ®æÂÂä½Âï¼ÂMyBatisÃ¥ÂÂæ´æÂÂå¡使ç¨åÂÂçÂÂçÂÂSQLè¯Âå¥ï¼ÂGorm使ç¨æ¹æ³Âé¾å¼ÂçÂÂæ¹å¼ÂæÂÂ建æ¥询ï¼Â以åÂÂåºäºÂç»ÂæÂÂä½ÂçÂÂæ¥询æÂÂ建å¨ï¼ÂMyBatiséÂÂè¿Âé Âç½®æÂÂ件æÂÂ注解æÂ¥æ å°Âæ°æ®模åÂÂÃ¥ÂÂæ°æ®åºÂ表ï¼Â
GormæÂÂä¾ÂäºÂä¸ÂäºÂæ¹便çÂÂç¹æ§ï¼Âå¦ÂäºÂå¡ãÂÂé©åÂÂçÂÂï¼Âä½Âæ¯ä¸Âè½ç´æÂ¥çÂÂæ§å¶æ§è½ï¼Âå¨æÂÂäºÂæ åµå¯è½ä¼Âé æÂÂæ§è½ç¼Âæ ¢ï¼Âå¦Âå¤ÂæÂÂçÂÂèÂÂ表æ¥询ï¼ÂMyBatisç±äºÂæÂÂå¨ç¼ÂÃ¥ÂÂSQLï¼Âå¯以æ´精ç»Âå°æ§å¶æ§è½ï¼Âä½Âä¹ÂéÂÂè¦Âæ´å¤ÂçÂÂ代ç Âç¼ÂÃ¥ÂÂï¼Â
综ä¸ÂGormä½Â为Goè¯Âè¨ÂçÂÂä¸Âå±ÂORMï¼Âæ¯æ¯Âè¾Âå¹´è½»çÂÂORMæ¡Âæ¶ï¼ÂæÂÂä¾ÂçÂÂæ°æ®åºÂæÂÂä½Âæ¹æ³Âä¼Âæ´å 丰å¯Âï¼Â使ç¨ä¹Âæ´å ç®Âæ´Âæ¹便ï¼Âä¸ÂæÂÂä¹Âæ´ç®ÂÃ¥ÂÂï¼Âä½Âæ¯åÂÂå¨ä¸Âå®ÂçÂÂå±ÂéÂÂæ§ï¼Âæ§è½æ¹é¢éÂÂè¦ÂéÂÂè¿Âå ¶ä»ÂæÂÂ段è°Âä¼Âï¼ÂMyBatisä½Â为èÂÂçÂÂçÂÂORMæ¡Âæ¶ï¼Âä»Âç¶æÂÂ巨大ä¼Âå¿åÂÂä¼Âè¶ÂçÂÂçÂÂæÂÂï¼Âä»Âç¶æ¯åÂÂè½å¾Â强大çÂÂæ¡Âæ¶ï¼Âä»Â们é½æ¯ç¨ÂåºÂÃ¥ÂÂéÂÂè¦Â好好å¦习çÂÂä¼Âç§ÂORMæ¡Âæ¶ï¼Â
Ã¥ÂÂãÂÂæ»ç»Â
该æ»ç»Âç¬Âè®°æ¯åºäºÂéÂÂè®Âè¥课ç¨ÂGoæ¡Âæ¶ä¸Â件å¥Âä¸ÂGormæ¡Âæ¶é¨åÂÂè¿Âè¡ÂçÂÂæ»ç»ÂæÂÂå±Âï¼Âå¨èÂÂå¸Â课ç¨Â讲解çÂÂåºç¡Âä¸Âèª己è¿ÂæÂ¥æ°æ®åºÂè¿Âè¡ÂäºÂæ°æ®æÂÂä½ÂçÂÂå®ÂéªÂï¼Â深堥çÂÂäºÂ解äºÂå ¶ä¸ÂçÂÂç»ÂèÂÂï¼Â并å¨æ¤åºç¡Âä¸ÂæÂÂå±ÂäºÂæ´å¤Âå ¶ä»ÂçÂÂç¨æ³Âï¼ÂæÂÂÃ¥ÂÂäºÂGormæ¡Âæ¶çÂÂæÂÂç¨æ§ï¼Âç»ÂÃ¥ÂÂGinæ¡Âæ¶åÂÂHertz以åÂÂKitexæ¡Âæ¶çÂÂå¦习ï¼Â表示对GolangÃ¥ÂÂ端æÂÂå¡çÂÂå¼ÂÃ¥ÂÂæÂÂäºÂæ´å æ´ä½Âæ§çÂÂ认è¯Âï¼Â
éÂÂè¿ÂèÂÂå¸ÂçÂÂ讲解åÂÂèª己çÂÂå®Âè·µï¼Â对Gormæ¡Âæ¶çÂÂ使ç¨åÂÂç¹æ§åÂÂå¾Âæ´å çÂÂæÂÂï¼Âè½å¤ÂéÂÂè¿Â该æ¡Âæ¶è¿Âè¡Âå®Âæ´çÂÂÃ¥ÂÂ端æ°æ®åºÂ交äºÂï¼ÂÃ¥ÂÂæ¶éÂÂè¿Âä¸Âå ¶ä»ÂORMæ¡Âæ¶çÂÂ对æ¯Âå¦习ï¼ÂæÂÂÃ¥ÂÂäºÂå®ÂçÂÂä¼Â缺ç¹ï¼Âæ¶èÂኼÂå¾Âå¤Âï¼Âç³»ç»ÂçÂÂå¦习使ç¨äºÂGormæ¡Âæ¶ï¼Âå¨大项ç®å¼ÂÃ¥ÂÂä¸ÂGormæ¹é¢çÂÂå¾Âå¤Âé®é¢Âä¹Âå¾Âå°äºÂ解çÂÂï¼Â
æ°æ®交äºÂæ¯åÂÂ端æÂÂå¡核å¿ÂçÂÂä¸Âé¨åÂÂï¼Âå¦好ORMæ¡Âæ¶æ¯解å³åÂÂ端é®é¢ÂçÂÂåºç¡Âï¼Âè½ç¶栢栢æ»ç»Âä¸ÂæÂ¥è±äºÂä¸Âå°Âæ¶é´ï¼Âä½Âæ¯éÂÂ常å¼å¾Âï¼Âè½系ç»ÂçÂÂæÂÂæ¡Gormå¯以æÂÂÃ¥ÂÂ解å³åÂÂç»Â项ç®å¼ÂÃ¥ÂÂçÂÂé®é¢Âï¼ÂçÂÂä¸Âè¿Âç¯Âç¬Âè®°ä¹Âæ¹便èª己åÂÂç»Âå¤Âä¹ åÂÂèµÂæÂÂæ¥询ï¼Âè¿Âæ¯å¾ÂæÂÂä»·å¼çÂÂï¼Â