github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/cmd/test/others/func/comm/dao.go (about)

     1  package comm
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/easysoft/zendata/cmd/test/others/func/model"
     8  	"github.com/fatih/color"
     9  	"gorm.io/driver/mysql"
    10  	"gorm.io/gorm"
    11  	"gorm.io/gorm/logger"
    12  	"gorm.io/plugin/dbresolver"
    13  )
    14  
    15  const (
    16  	dbUser   = "root"
    17  	dbUrl    = "127.0.0.1:3306"
    18  	dbPasswd = "P2ssw0rd"
    19  	dbName   = "zendata"
    20  )
    21  
    22  var (
    23  	DB *gorm.DB
    24  )
    25  
    26  func GetDB() *gorm.DB {
    27  	if DB != nil {
    28  		return DB
    29  	}
    30  
    31  	DB = GormMySQL()
    32  	_ = DB.Use(
    33  		dbresolver.Register(
    34  			dbresolver.Config{}).
    35  			SetConnMaxIdleTime(time.Hour).
    36  			SetConnMaxLifetime(24 * time.Hour).
    37  			SetMaxIdleConns(100).
    38  			SetMaxOpenConns(200),
    39  	)
    40  
    41  	DB.Session(&gorm.Session{FullSaveAssociations: true, AllowGlobalUpdate: false})
    42  
    43  	err := DB.AutoMigrate(
    44  		&model.DataCategory1{},
    45  		&model.DataCategory2{},
    46  
    47  		&model.DataFood{},
    48  		&model.DataAnimalPlant{},
    49  		&model.DataAnimalPlant{},
    50  		&model.DataFruit{},
    51  		&model.DataConstellation{},
    52  		&model.DataZodiac{},
    53  		&model.EightDiagram{},
    54  		&model.Dynasty{},
    55  		&model.CarBrand{},
    56  		&model.CarComponent{},
    57  
    58  		&model.PcOs{},
    59  		&model.PcFileExt{},
    60  
    61  		&model.PhoneModel{},
    62  		&model.Place{},
    63  		&model.Song{},
    64  		&model.Bank{},
    65  		&model.Advert{},
    66  		&model.IdiomSimple{},
    67  		&model.PoetryAncient{},
    68  		&model.PoetryCategory{},
    69  		&model.Medicine{},
    70  		&model.Joke{},
    71  
    72  		&model.AreaCodeCity{},
    73  		&model.AreaCodeCountry{},
    74  	)
    75  	if err != nil {
    76  		fmt.Printf(color.RedString("migrate models failed, error: %s.", err.Error()))
    77  	}
    78  
    79  	return DB
    80  }
    81  
    82  func GormMySQL() *gorm.DB {
    83  	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", dbUser, dbPasswd, dbUrl, dbName, "charset=utf8mb4&parseTime=True&loc=Local")
    84  
    85  	mysqlConfig := mysql.Config{
    86  		DSN:                       dsn,   // DSN data source name
    87  		DefaultStringSize:         191,   // string 类型字段的默认长度
    88  		DisableDatetimePrecision:  true,  // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
    89  		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
    90  		DontSupportRenameColumn:   true,  // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
    91  		SkipInitializeWithVersion: false, // 根据版本自动配置
    92  	}
    93  
    94  	if db, err := gorm.Open(mysql.New(mysqlConfig), &gorm.Config{
    95  		Logger: logger.Default.LogMode(logger.Info),
    96  	}); err != nil {
    97  		return nil
    98  	} else {
    99  		sqlDB, _ := db.DB()
   100  		sqlDB.SetMaxIdleConns(0)
   101  		sqlDB.SetMaxOpenConns(0)
   102  		return db
   103  	}
   104  }