ensure_tables.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package initialize
  2. import (
  3. "context"
  4. adapter "github.com/casbin/gorm-adapter/v3"
  5. "gorm.io/gorm"
  6. "log-server/model/example"
  7. sysModel "log-server/model/system"
  8. "log-server/service/system"
  9. )
  10. const initOrderEnsureTables = system.InitOrderExternal - 1
  11. type ensureTables struct{}
  12. // auto run
  13. func init() {
  14. system.RegisterInit(initOrderEnsureTables, &ensureTables{})
  15. }
  16. func (ensureTables) InitializerName() string {
  17. return "ensure_tables_created"
  18. }
  19. func (e *ensureTables) InitializeData(ctx context.Context) (next context.Context, err error) {
  20. return ctx, nil
  21. }
  22. func (e *ensureTables) DataInserted(ctx context.Context) bool {
  23. return true
  24. }
  25. func (e *ensureTables) MigrateTable(ctx context.Context) (context.Context, error) {
  26. db, ok := ctx.Value("db").(*gorm.DB)
  27. if !ok {
  28. return ctx, system.ErrMissingDBContext
  29. }
  30. tables := []interface{}{
  31. sysModel.SysApi{},
  32. sysModel.SysUser{},
  33. sysModel.SysBaseMenu{},
  34. sysModel.SysAuthority{},
  35. sysModel.JwtBlacklist{},
  36. sysModel.SysDictionary{},
  37. sysModel.SysAutoCodeHistory{},
  38. sysModel.SysOperationRecord{},
  39. sysModel.SysDictionaryDetail{},
  40. sysModel.SysBaseMenuParameter{},
  41. sysModel.SysBaseMenuBtn{},
  42. sysModel.SysAuthorityBtn{},
  43. sysModel.SysAutoCode{},
  44. adapter.CasbinRule{},
  45. example.ExaFile{},
  46. example.ExaCustomer{},
  47. example.ExaFileChunk{},
  48. example.ExaFileUploadAndDownload{},
  49. }
  50. for _, t := range tables {
  51. _ = db.AutoMigrate(&t)
  52. // 视图 authority_menu 会被当成表来创建,引发冲突错误(更新版本的gorm似乎不会)
  53. // 由于 AutoMigrate() 基本无需考虑错误,因此显式忽略
  54. }
  55. return ctx, nil
  56. }
  57. func (e *ensureTables) TableCreated(ctx context.Context) bool {
  58. db, ok := ctx.Value("db").(*gorm.DB)
  59. if !ok {
  60. return false
  61. }
  62. tables := []interface{}{
  63. sysModel.SysApi{},
  64. sysModel.SysUser{},
  65. sysModel.SysBaseMenu{},
  66. sysModel.SysAuthority{},
  67. sysModel.JwtBlacklist{},
  68. sysModel.SysDictionary{},
  69. sysModel.SysAutoCodeHistory{},
  70. sysModel.SysOperationRecord{},
  71. sysModel.SysDictionaryDetail{},
  72. sysModel.SysBaseMenuParameter{},
  73. sysModel.SysBaseMenuBtn{},
  74. sysModel.SysAuthorityBtn{},
  75. sysModel.SysAutoCode{},
  76. adapter.CasbinRule{},
  77. example.ExaFile{},
  78. example.ExaCustomer{},
  79. example.ExaFileChunk{},
  80. example.ExaFileUploadAndDownload{},
  81. }
  82. yes := true
  83. for _, t := range tables {
  84. yes = yes && db.Migrator().HasTable(t)
  85. }
  86. return yes
  87. }