65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|