You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.4 KiB

2 years ago
package dbm
import (
"fmt"
"github.com/han-joker/moo-layout/api/moo/confm"
"github.com/han-joker/moo-layout/api/moo/logm"
"github.com/han-joker/moo-layout/api/moo/toolm"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
const defaultType = "sqlite"
type DSN = string
var pool = map[DSN]*gorm.DB{}
type Option struct {
DSN
Options []gorm.Option
}
// New 创建对象
func New(options ...Option) *gorm.DB {
option := verifyOption(options)
return create(option)
}
// Get 存在直接返回,否则创建、存储再返回
func Get(options ...Option) *gorm.DB {
option := verifyOption(options)
if !Has(option.DSN) {
pool[option.DSN] = create(option)
}
return pool[option.DSN]
}
func verifyOption(options []Option) Option {
t := toolm.StringDefault(confm.Get().String("app.databaseType"), defaultType)
option := Option{
DSN: confm.Get().String(fmt.Sprintf("%s.DSN", t)),
Options: []gorm.Option{},
}
if len(options) > 0 {
if options[0].DSN != "" {
option.DSN = options[0].DSN
}
if options[0].Options != nil {
option.Options = options[0].Options
}
}
return option
}
// Has 存在返回 true否则返回 false
func Has(dialector DSN) bool {
_, has := pool[dialector]
return has && pool[dialector] != nil
}
func create(option Option) *gorm.DB {
db, err := gorm.Open(sqlite.Open(option.DSN), option.Options...)
if err != nil {
logm.Get().Error(err)
}
return db
}