Initial commit
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"pet-house.com/core/server/viper_server"
|
||||
"pet-house.com/core/server/zap_server"
|
||||
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
var ErrDatabaseInit = errors.New("database initialize fail")
|
||||
|
||||
var (
|
||||
once sync.Once
|
||||
db *gorm.DB
|
||||
)
|
||||
|
||||
// init
|
||||
func init() {
|
||||
viper_server.Init(getViperConfig())
|
||||
}
|
||||
|
||||
// Instance
|
||||
func Instance() *gorm.DB {
|
||||
once.Do(func() {
|
||||
db = gormMysql()
|
||||
})
|
||||
return db
|
||||
}
|
||||
|
||||
// gormMysql get *gorm.DB
|
||||
func gormMysql() *gorm.DB {
|
||||
if CONFIG.DbName == "" {
|
||||
fmt.Println("config dbname is empty")
|
||||
return nil
|
||||
}
|
||||
/*err := createTable(CONFIG.BaseDsn(), "mysql", CONFIG.DbName)
|
||||
if err != nil {
|
||||
fmt.Printf("create database %s is failed %v \n", CONFIG.DbName, err)
|
||||
return nil
|
||||
}*/
|
||||
mysqlConfig := mysql.Config{
|
||||
DSN: CONFIG.Dsn(),
|
||||
DefaultStringSize: 191,
|
||||
DisableDatetimePrecision: true,
|
||||
DontSupportRenameIndex: true,
|
||||
DontSupportRenameColumn: true,
|
||||
SkipInitializeWithVersion: false,
|
||||
}
|
||||
if db, err := gorm.Open(mysql.New(mysqlConfig), gormConfig(CONFIG.LogMode)); err != nil {
|
||||
fmt.Printf("open mysql is failed %v \n", err)
|
||||
return nil
|
||||
} else {
|
||||
sqlDB, _ := db.DB()
|
||||
sqlDB.SetMaxIdleConns(CONFIG.MaxIdleConns)
|
||||
sqlDB.SetMaxOpenConns(CONFIG.MaxOpenConns)
|
||||
return db
|
||||
}
|
||||
}
|
||||
|
||||
// gormConfig get gorm config
|
||||
func gormConfig(mod bool) *gorm.Config {
|
||||
var config = &gorm.Config{DisableForeignKeyConstraintWhenMigrating: true}
|
||||
switch CONFIG.LogZap {
|
||||
case "silent", "Silent":
|
||||
config.Logger = Default.LogMode(logger.Silent)
|
||||
case "error", "Error":
|
||||
config.Logger = Default.LogMode(logger.Error)
|
||||
case "warn", "Warn":
|
||||
config.Logger = Default.LogMode(logger.Warn)
|
||||
case "info", "Info":
|
||||
config.Logger = Default.LogMode(logger.Info)
|
||||
case "zap", "Zap":
|
||||
config.Logger = Default.LogMode(logger.Info)
|
||||
default:
|
||||
if mod {
|
||||
config.Logger = Default.LogMode(logger.Info)
|
||||
break
|
||||
}
|
||||
config.Logger = Default.LogMode(logger.Silent)
|
||||
}
|
||||
return config
|
||||
}
|
||||
|
||||
// createTable create database(mysql)
|
||||
func createTable(dsn, driver, dbName string) error {
|
||||
createSql := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS `%s` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;", dbName)
|
||||
db, err := sql.Open(driver, dsn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func(db *sql.DB) {
|
||||
_ = db.Close()
|
||||
}(db)
|
||||
if err = db.Ping(); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = db.Exec(createSql)
|
||||
return err
|
||||
}
|
||||
|
||||
func DorpDB(dsn, driver, dbName string) error {
|
||||
execSql := fmt.Sprintf("DROP database if exists `%s`;", dbName)
|
||||
db, err := sql.Open(driver, dsn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if db == nil {
|
||||
return errors.New("db is nil")
|
||||
}
|
||||
defer func(db *sql.DB) {
|
||||
_ = db.Close()
|
||||
}(db)
|
||||
if err = db.Ping(); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = db.Exec(execSql)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
zap_server.ZAPLOG.Debug(execSql)
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user