代码目录:
main.go
go.mod
go.sum
makeData/makeData.go
main.go:
package main
import (
"fmt"
"strconv"
"strings"
//"mysqltaskdirdemo/makeData"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type VsTask struct {
ID uint
Sha256 string
FileType uint8
}
type VsDir struct {
ID uint
VsTaskId string
}
func CreateVsDir(db *gorm.DB) error {
// Note the use of tx as the database handle once you are within a transaction
//get min id from vs_tasks
//get five records from vs_tasks
//insert into this five records to vs_dirs
//delete this five records from vs_tasks
//commit
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return err
}
var ID string
if err := tx.Raw("SELECT MIN(ID) FROM vs_tasks").Scan(&ID).Error; err != nil {
tx.Rollback()
return err
}
var IDs []string
IDnum, err := strconv.Atoi(ID)
if err != nil {
panic(err)
}
upID := IDnum + 4
if err := tx.Raw("select ID from vs_tasks WHERE ID >= ? and ID <= ? for update", ID, upID).Scan(&IDs).Error; err != nil {
tx.Rollback()
return err
}
VsTaskIdStr := strings.Join(IDs, ", ")
vsdir := VsDir{VsTaskId: VsTaskIdStr}
if err := tx.Create(&vsdir).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Exec("delete from vs_tasks WHERE ID IN ?", IDs).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
func main() {
fmt.Println("start")
dsn := ":@tcp(192:3306)/?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
//makeData.InsertTableRand(db)
for {
CreateVsDir(db)
}
}
makeData.go:
package makeData
import (
"fmt"
"math/rand"
"time"
"gorm.io/gorm"
)
type VsTask struct {
ID uint
Sha256 string
FileType uint8
}
var defaultLetters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
// RandomString returns a random string with a fixed length
func RandomString(n int, allowedChars ...[]rune) string {
var letters []rune
if len(allowedChars) == 0 {
letters = defaultLetters
} else {
letters = allowedChars[0]
}
b := make([]rune, n)
for i := range b {
b[i] = letters[rand.Intn(len(letters))]
}
return string(b)
}
func insertTableRand(db *gorm.DB) {
fmt.Println("start insert into")
for {
sha256Str := RandomString(64)
fileTypeNum := rand.Intn(len(defaultLetters))
sleepTime := rand.Intn(3)
user := VsTask{Sha256: sha256Str, FileType: uint8(fileTypeNum)}
result := db.Create(&user)
fmt.Println(result.RowsAffected)
time.Sleep(time.Second * time.Duration(sleepTime))
}
}