migration.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package db
  2. import (
  3. "go.uber.org/zap"
  4. "cold-delivery/app/admin/model"
  5. jobModel "cold-delivery/app/jobs/model"
  6. "fmt"
  7. "log"
  8. "os"
  9. "strings"
  10. "gorm.io/gorm"
  11. )
  12. // 执行数据迁移
  13. func AutoMigrateDB() {
  14. //自动迁移模式
  15. err := DB.Set("gorm:table_options", "charset=utf8mb4").
  16. AutoMigrate(
  17. &jobModel.SysJob{},
  18. &model.SysUser{},
  19. &model.SysRole{},
  20. &model.SysRoleMenu{},
  21. &model.SysMenu{},
  22. &model.SysDept{},
  23. &model.SysLoginLog{},
  24. &model.SysOperaLog{},
  25. &model.Address{},
  26. &model.AddressDefault{},
  27. &model.CoolerBox{},
  28. &model.Waybill{},
  29. &model.WaybillLogistics{},
  30. &model.WaybillTask{},
  31. &model.IceRaft{},
  32. &model.IceLocker{},
  33. &model.IceRaftRecord{},
  34. &model.CoolerBoxRecord{},
  35. &model.Drug{},
  36. &model.SysPost{},
  37. &model.SysPostMenu{},
  38. )
  39. if err != nil {
  40. zap.L().Panic("migrate db fail", zap.Error(err))
  41. }
  42. }
  43. // AutoSeedMenus 检查并初始化菜单数据
  44. func AutoSeedMenus() {
  45. var count int64
  46. DB.Table("sys_menu").Count(&count)
  47. if count > 0 {
  48. return
  49. }
  50. log.Println("sys_menu 表为空,开始初始化菜单数据...")
  51. err := ExecSqlFile(DB, "conf/menu_seed.sql")
  52. if err != nil {
  53. log.Printf("菜单数据初始化失败: %s", err.Error())
  54. } else {
  55. log.Println("菜单数据初始化完成")
  56. }
  57. }
  58. // ExecSqlFile 执行SQL文件
  59. func ExecSqlFile(db *gorm.DB, filePath string) error {
  60. sql, err := ioUtil(filePath)
  61. if err != nil {
  62. return fmt.Errorf("读取SQL文件失败: %s", err.Error())
  63. }
  64. tx := db.Begin()
  65. defer func() {
  66. if err != nil {
  67. tx.Rollback()
  68. } else {
  69. tx.Commit()
  70. }
  71. }()
  72. sqlList := strings.Split(sql, ";")
  73. for i := 0; i < len(sqlList)-1; i++ {
  74. s := strings.TrimSpace(sqlList[i])
  75. if s == "" || strings.HasPrefix(s, "--") {
  76. continue
  77. }
  78. s = sqlList[i] + ";"
  79. s = strings.Replace(s, "\n", "", -1)
  80. s = strings.TrimSpace(s)
  81. if s == ";" {
  82. continue
  83. }
  84. if err = tx.Exec(s).Error; err != nil {
  85. if !strings.Contains(err.Error(), "Query was empty") {
  86. log.Printf("error sql: %s", s)
  87. return err
  88. }
  89. }
  90. }
  91. return nil
  92. }
  93. func ioUtil(filePath string) (string, error) {
  94. contents, err := os.ReadFile(filePath)
  95. if err != nil {
  96. return "", err
  97. }
  98. return strings.Replace(string(contents), "\n", "", 1), nil
  99. }