initdb.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package migrate
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "strings"
  7. "gorm.io/gorm"
  8. )
  9. func InitDb(db *gorm.DB) (err error) {
  10. filePath := "conf/db.sql"
  11. if err = ExecSql(db, filePath); err != nil {
  12. return err
  13. }
  14. // 初始化菜单数据(如果表为空)
  15. menuPath := "conf/menu_seed.sql"
  16. var count int64
  17. db.Table("sys_menu").Count(&count)
  18. if count == 0 {
  19. log.Println("sys_menu 表为空,开始初始化菜单数据...")
  20. if err = ExecSql(db, menuPath); err != nil {
  21. log.Printf("菜单数据初始化失败: %s", err)
  22. return err
  23. }
  24. log.Println("菜单数据初始化完成")
  25. }
  26. return err
  27. }
  28. func ExecSql(db *gorm.DB, filePath string) error {
  29. sql, err := IoUtil(filePath)
  30. if err != nil {
  31. fmt.Println("数据库基础数据初始化脚本读取失败!原因:", err.Error())
  32. return err
  33. }
  34. tx := db.Begin()
  35. defer func() {
  36. if err != nil {
  37. tx.Rollback()
  38. } else {
  39. tx.Commit()
  40. }
  41. }()
  42. sqlList := strings.Split(sql, ";")
  43. for i := 0; i < len(sqlList)-1; i++ {
  44. if strings.Contains(sqlList[i], "--") {
  45. fmt.Println(sqlList[i])
  46. continue
  47. }
  48. sql := strings.Replace(sqlList[i]+";", "\n", "", -1)
  49. sql = strings.TrimSpace(sql)
  50. if err = tx.Exec(sql).Error; err != nil {
  51. log.Printf("error sql: %s", sql)
  52. if !strings.Contains(err.Error(), "Query was empty") {
  53. return err
  54. }
  55. }
  56. }
  57. return nil
  58. }
  59. func IoUtil(filePath string) (string, error) {
  60. if contents, err := os.ReadFile(filePath); err == nil {
  61. //因为contents是[]byte类型,直接转换成string类型后会多一行空格,需要使用strings.Replace替换换行符
  62. result := strings.Replace(string(contents), "\n", "", 1)
  63. fmt.Println("Use ioUtil.ReadFile to read a file:", result)
  64. return result, nil
  65. } else {
  66. return "", err
  67. }
  68. }