package db import ( "fmt" "os" "github.com/zhilv666/go-gin-scaffold/pkg/config" "go.uber.org/zap" "gorm.io/gorm" "gorm.io/gorm/logger" ) var db *gorm.DB func init() { if _, err := os.Stat("./data"); os.IsNotExist(err) { _ = os.Mkdir("./data", os.ModePerm) } } func GetDB() *gorm.DB { if db == nil { panic("数据库未初始化,请先调用 db.InitDB()") } return db } func InitDB(cfg config.Database, log *zap.Logger) { go func() { if err := recover(); err != nil { panic(fmt.Sprintf("Init DB Error: %v", err)) } }() var dsn string var dialector gorm.Dialector switch cfg.Driver { case "mysql": dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DbName) dialector = connectMySQL(dsn) case "postgres": dsn = fmt.Sprintf("host=%s port=%d user=%s dbname=%s password=%s sslmode=disable", cfg.Host, cfg.Port, cfg.User, cfg.DbName, cfg.Password) dialector = connectPostgres(dsn) case "sqlserver": dsn = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DbName) dialector = connectSQLServer(dsn) case "sqlite", "sqlite3": fmt.Println(cfg.SqliteDbPath) dialector = connectSQLite(cfg.SqliteDbPath) default: panic(fmt.Errorf("unsupport database driver: %s", cfg.Driver)) } var err error db, err = gorm.Open(dialector, &gorm.Config{ Logger: NewZapGormLogger(log).LogMode(logger.Info), }) if err != nil { panic(err) } }