brush.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "gorm.io/driver/mysql"
  6. "gorm.io/gorm"
  7. "gorm.io/gorm/logger"
  8. "log"
  9. "math/rand"
  10. "net/url"
  11. "os"
  12. "time"
  13. )
  14. var username,password,host,db string
  15. var port int
  16. type Project struct {
  17. Id uint `gorm:"primarykey"`
  18. Code string `gorm:"column:code;type:varchar(16);not null;default:''"`
  19. APIKey string `gorm:"column:api_key;type:varchar(255);not null;default:''"`
  20. APISecret string `gorm:"column:api_secret;type:varchar(255);not null;default:''"`
  21. ChainId uint `gorm:"column:chain_id;type:bigint(20);not null"`
  22. UserId uint `gorm:"column:user_id;type:bigint(20);not null"`
  23. Name string `gorm:"column:name;type:varchar(255);not null;default:''"`
  24. Description string `gorm:"column:description;type:varchar(255);not null;default:''"`
  25. CreatedAt time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP"`
  26. UpdatedAt time.Time `gorm:"column:updated_at;type:datetime ON UPDATE CURRENT_TIMESTAMP;not null;default:CURRENT_TIMESTAMP"`
  27. }
  28. func (Project) TableName() string {
  29. return "project"
  30. }
  31. func main(){
  32. flag.StringVar(&username, "u", "console", "")
  33. flag.StringVar(&password, "pwd", "consolePassword", "")
  34. flag.StringVar(&host, "h", "192.168.150.40", "")
  35. flag.StringVar(&db, "d", "console_server", "")
  36. flag.IntVar(&port, "p", 23306, "")
  37. flag.Parse()
  38. newLogger := logger.New(
  39. log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
  40. logger.Config{
  41. SlowThreshold: time.Second, // 慢 SQL 阈值
  42. LogLevel: logger.Silent, // Log level
  43. Colorful: false, // 禁用彩色打印
  44. },
  45. )
  46. dsn := fmt.Sprintf(
  47. "%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&time_zone=%s",
  48. username,
  49. password,
  50. host,
  51. port,
  52. db,
  53. url.QueryEscape("'UTC'"),
  54. )
  55. mysqlDb, err := gorm.Open(mysql.Open(dsn),&gorm.Config{Logger:newLogger})
  56. if err != nil {
  57. log.Fatal("init mysql db failed, err: ",err.Error())
  58. }
  59. codeMap := make(map[string]int)
  60. tx := mysqlDb.Begin()
  61. //增加sql
  62. alterSql := "ALTER TABLE `project` MODIFY COLUMN `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id' FIRST, ADD COLUMN `code` varchar(16) NOT NULL DEFAULT \"\" COMMENT \"项目id\" AFTER `id`"
  63. err = tx.Exec(alterSql).Error
  64. if err != nil {
  65. tx.Rollback()
  66. log.Fatal("add code failed, err: ",err.Error())
  67. }
  68. //查询code为null的数据
  69. var projectList []Project
  70. err = tx.Model(&Project{}).Where("code = ?","").Find(&projectList).Error
  71. if err != nil {
  72. tx.Rollback()
  73. log.Fatal("query code is null failed, err: ",err.Error())
  74. }
  75. if len(projectList) > 0 {
  76. for _,item := range projectList {
  77. var code string
  78. for {
  79. code = GetRandomString(16)
  80. _,ok := codeMap[code]
  81. if !ok {
  82. codeMap[code] = 1
  83. break
  84. }
  85. }
  86. updateMap := map[string]interface{}{}
  87. updateMap["code"] = code
  88. err = tx.Model(&Project{}).Where("id = ?", item.Id).Updates(updateMap).Error
  89. if err != nil {
  90. tx.Rollback()
  91. log.Fatal("update code failed, err: ",err.Error())
  92. }
  93. }
  94. }
  95. indexSql := "ALTER TABLE `project` ADD UNIQUE INDEX `code`(`code`) USING BTREE;"
  96. err = mysqlDb.Exec(indexSql).Error
  97. if err != nil {
  98. tx.Rollback()
  99. log.Fatal("add index failed, err: ",err.Error())
  100. }
  101. tx.Commit()
  102. fmt.Println("finish")
  103. }
  104. func GetRandomString(l int) string {
  105. str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  106. bytes := []byte(str)
  107. var result []byte
  108. r := rand.New(rand.NewSource(time.Now().UnixNano() + int64(rand.Intn(100))))
  109. for i := 0; i < l; i++ {
  110. result = append(result, bytes[r.Intn(len(bytes))])
  111. }
  112. return string(result)
  113. }