1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| package main
import ( "errors" "fmt" "time"
"gorm.io/driver/sqlite" "gorm.io/gorm" )
type Code struct { ID string `gorm:"primaryKey"` CreatedAt time.Time UpdatedAt time.Time Batch string Code int64 }
func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") }
// 迁移 schema db.AutoMigrate(&Code{})
fmt.Println(IncAndGet(db, "test", "oo")) }
func IncAndGet(db *gorm.DB, idType string, batch string) (id int64, err error) { code := Code{ID: idType, Batch: batch} var result *gorm.DB for i := 0; i <= 10; i++ { result = db.First(&code) if result.Error == nil { if batch == code.Batch { newCode := code.Code + 1 result = db.Debug().Model(&code).Where("code = ?", code.Code).Updates(Code{Code: newCode}) if result.RowsAffected > 0 { return newCode, nil } else { continue } } else { var newCode int64 newCode = 1 result = db.Debug().Model(&code).Where("code = ? and batch = ?", code.Code, code.Batch).Updates(Code{Code: newCode, Batch: batch}) if result.RowsAffected > 0 { return newCode, nil } else { continue } } } if errors.Is(result.Error, gorm.ErrRecordNotFound) { code.Code = 1 result = db.Create(&code) if result.Error != nil { continue } return code.Code, nil } }
return 0, result.Error }
|