package operations import ( "fmt" "github.com/pkg/errors" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" ) const ( logLevelSilent = "silent" logLevelError = "error" logLevelWarn = "warn" logLevelInfo = "info" ) func newGormDB(dbConfig *Config) (*gorm.DB, error) { if dbConfig == nil { return nil, errors.New("没有传递数据库配置") } gormDB, err := newPostgresGormDB(dbConfig) if err != nil { return nil, err } return gormDB, nil } func newPostgresGormDB(dbConfig *Config) (*gorm.DB, error) { dsn := "host=%s port=%s user=%s password=%s dbname=%s sslmode=disable TimeZone=Asia/Shanghai" connStr := fmt.Sprintf(dsn, dbConfig.Address, dbConfig.Port, dbConfig.UserName, dbConfig.Password, dbConfig.Database) gormDB, err := gorm.Open(postgres.Open(connStr), &gorm.Config{ Logger: logger.Default.LogMode(chooseLogLevel(dbConfig.LogLevel)), PrepareStmt: true, }) if err != nil { return nil, errors.New(err.Error()) } return gormDB, nil } func destroyGormDB(gormDB *gorm.DB) error { if gormDB == nil { return nil } db, err := gormDB.DB() if err != nil { return errors.New(err.Error()) } err = db.Close() if err != nil { return errors.New(err.Error()) } db = nil return nil } func chooseLogLevel(logLevel string) logger.LogLevel { switch logLevel { case logLevelSilent: return logger.Silent case logLevelError: return logger.Error case logLevelWarn: return logger.Warn case logLevelInfo: return logger.Info default: return logger.Info } }