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 }