package gormExample import ( "fmt" "gorm.io/gorm" "gorm.io/gorm/clause" "log" "time" ) type User struct { gorm.Model Username string Name string Email string Birthday *time.Time } func OperatorType() { DB.AutoMigrate(&User{}) var users []User // 一步操作 err := DB. Order("name DESC"). Where("email like ?", "@163.com%"). Where("birthday IS NOT NULL"). Find(&users).Error // select all if err != nil { log.Fatal(err) } // 分步操作 query := DB.Where("birthday IS NOT NULL") query = query.Where("email like ?", "@163.com%") query = query.Order("name DESC") query.Find(&users) } func CreateBasic() { DB.AutoMigrate(&Content{}) // 模型映射记录,操作模型字段,就是操作记录的列 c1 := Content{} c1.Subject = "GORM的使用" // 执行创建(insert) result1 := DB.Create(&c1) // 处理错误 if result1.Error != nil { log.Fatal(result1.Error) } // 最新的ID,和影响的记录数 fmt.Println(c1.ID, result1.RowsAffected) // map 指定数据 //设置map 的values values := map[string]any{ "Subject": "Map指定值", "PublishTime": time.Now(), } // create result2 := DB.Model(&Content{}).Create(values) if result2.Error != nil { log.Fatal(result2.Error) } // 测试输出 fmt.Println(result2.RowsAffected) } func CreateMulti() { DB.AutoMigrate(&Content{}) // 定义模型的切片 models := []Content{ {Subject: "标题1"}, {Subject: "标题2"}, {Subject: "标题3"}, } // create 插入 result := DB.Create(&models) if result.Error != nil { log.Fatal(result.Error) } fmt.Println("RowsAffected:", result.RowsAffected) for _, m := range models { fmt.Println("ID:", m.ID) } // 切片结构同样支持 vs := []map[string]any{ {"Subject": "标题4"}, {"Subject": "标题5"}, {"Subject": "标题6"}, } result2 := DB.Model(&Content{}).Create(vs) if result2.Error != nil { log.Fatal(result2.Error) } fmt.Println("RowsAffected:", result2.RowsAffected) } func CreateBatch() { DB.AutoMigrate(&Content{}) // 定义模型的切片 models := []Content{ {Subject: "标题1"}, {Subject: "标题2"}, {Subject: "标题3"}, } // create 插入 result := DB.CreateInBatches(&models, 2) if result.Error != nil { log.Fatal(result.Error) } fmt.Println("RowsAffected:", result.RowsAffected) for _, m := range models { fmt.Println("ID:", m.ID) } // 切片结构同样支持 vs := []map[string]any{ {"Subject": "标题4"}, {"Subject": "标题5"}, {"Subject": "标题6"}, } result2 := DB.Model(&Content{}).CreateInBatches(vs, 2) if result2.Error != nil { log.Fatal(result2.Error) } fmt.Println("RowsAffected:", result2.RowsAffected) } func UpSert() { DB.AutoMigrate(&Content{}) // 常规插入,原始数据 c1 := Content{} c1.Subject = "原始标题" c1.Likes = 10 DB.Create(&c1) fmt.Println(c1) // 主键冲突的错误 //c2 := Content{} //c2.ID = c1.ID //c2.Subject = "新标题" //c2.Likes = 20 //if err := DB.Create(&c2).Error; err != nil { // log.Fatal(err) // // Error 1062 (23000): Duplicate entry '17' for key 'msb_content.PRIMARY' //} // 冲突后,更新全部字段 //c3 := Content{} //c3.ID = c1.ID //c3.Subject = "新标题" //c3.Likes = 20 //if err := DB. // Clauses(clause.OnConflict{ // UpdateAll: true, // }). // Create(&c3).Error; err != nil { // log.Fatal(err) //} // 冲突后,更新部分字段 c4 := Content{} c4.ID = c1.ID c4.Subject = "新标题" c4.Likes = 20 if err := DB. Clauses(clause.OnConflict{ DoUpdates: clause.AssignmentColumns([]string{"likes"}), }). Create(&c4).Error; err != nil { log.Fatal(err) } } func DefaultValue() { DB.AutoMigrate(&Content{}) // 常规插入,原始数据 c1 := Content{} c1.Subject = "原始标题" c1.Likes = 0 //views := uint(0) //c1.Views = &views DB.Create(&c1) //fmt.Println(c1.Likes, *c1.Views) } func DefaultValueOften() { DB.AutoMigrate(&Content{}) c1 := NewContent() c1.Subject = "原始标题" DB.Create(&c1) fmt.Println(c1.Likes, c1.Views) } func SelectOmit() { DB.AutoMigrate(&Content{}) c1 := Content{} c1.Subject = "原始标题" c1.Likes = 10 c1.Views = 99 now := time.Now() c1.PublishTime = &now //DB.Select("Subject", "Likes", "UpdatedAt").Create(&c1) //INSERT INTO `msb_content` (`created_at`,`updated_at`,`subject`,`likes`) VALUES ('2023-04-11 18:11:26.384','2023-04-11 18:11:26.384','原始标题',10) DB.Omit("Subject", "Likes", "UpdatedAt").Create(&c1) //INSERT INTO `msb_content` (`created_at`,`deleted_at`,`views`,`publish_time`) VALUES ('2023-04-11 18:12:39.431',NULL,99,'2023-04-11 18:12:39.429') } func CreateHook() { DB.AutoMigrate(&Content{}) c1 := Content{} err := DB.Create(&c1).Error if err != nil { log.Fatal(err) } //INSERT INTO `msb_content` (`created_at`,`updated_at`,`deleted_at`,`subject`,`likes`,`views`,`publish_time`) VALUES ('2023-04-11 18:44:56.62','2023-04-11 18:44:56.62',NULL,'',0,0,'2023-04-11 18:44:56.62') ON DUPLICATE KEY UPDATE `updated_at`='2023-04-11 18:44:56.62',`deleted_at`=VALUES(`deleted_at`),`subject`=VALUES(`subject`),`likes`=VALUES(`likes`),`views`=VALUES(`views`),`publish_time`=VALUES(`publish_time`) }