migration.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package model
  2. import (
  3. "fmt"
  4. "os"
  5. "gorm.io/driver/mysql"
  6. "gorm.io/gorm"
  7. "gorm.io/gorm/schema"
  8. )
  9. var DB *gorm.DB
  10. func Construct(isMigrate bool) {
  11. dbPrefix := os.Getenv("DB_PREFIX")
  12. var err error
  13. DB, err = gorm.Open(mysql.Open(fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
  14. os.Getenv("DB_USERNAME"),
  15. os.Getenv("DB_PASSWORD"),
  16. os.Getenv("DB_HOST"),
  17. os.Getenv("DB_PORT"),
  18. os.Getenv("DB_DATABASE"))),
  19. &gorm.Config{
  20. NamingStrategy: schema.NamingStrategy{
  21. SingularTable: true,
  22. TablePrefix: dbPrefix,
  23. },
  24. DisableForeignKeyConstraintWhenMigrating: true,
  25. SkipDefaultTransaction: true,
  26. QueryFields: true,
  27. })
  28. if err != nil {
  29. panic(err)
  30. }
  31. // debug模式输出所有sql语句
  32. // if os.Getenv("APP_DEBUG") == "true" {
  33. DB = DB.Debug()
  34. // }
  35. sqlDB, err := DB.DB()
  36. if err != nil {
  37. panic(err)
  38. }
  39. sqlDB.SetMaxIdleConns(10)
  40. sqlDB.SetMaxOpenConns(100)
  41. // 开始迁移
  42. if isMigrate {
  43. Migrate()
  44. }
  45. }
  46. func Migrate() {
  47. // 用户信息
  48. DB.Set("gorm:table_options", "ENGINE=InnoDB default charset = utf8mb4").AutoMigrate(&User{})
  49. // 用户角色关系
  50. DB.Set("gorm:table_options", "ENGINE=InnoDB default charset = utf8mb4").AutoMigrate(&UserRole{})
  51. // 角色
  52. DB.Set("gorm:table_options", "ENGINE=InnoDB default charset = utf8mb4").AutoMigrate(&Role{})
  53. }
  54. // 分页查询的Scope
  55. func Paginate(page int, pageSize int) func(db *gorm.DB) *gorm.DB {
  56. return func(db *gorm.DB) *gorm.DB {
  57. if page == 0 {
  58. page = 1
  59. }
  60. switch {
  61. case pageSize > 100:
  62. pageSize = 100
  63. case pageSize <= 0:
  64. pageSize = 10
  65. }
  66. offset := (page - 1) * pageSize
  67. return db.Offset(offset).Limit(pageSize)
  68. }
  69. }
  70. // 分页查询的Scope
  71. func Limit(limit int) func(db *gorm.DB) *gorm.DB {
  72. return func(db *gorm.DB) *gorm.DB {
  73. switch {
  74. case limit > 100:
  75. limit = 100
  76. case limit <= 0:
  77. limit = 10
  78. }
  79. return db.Limit(limit)
  80. }
  81. }