package postgres import ( "os" "strconv" "time" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" "gorm.io/plugin/dbresolver" ) var ( _db *gorm.DB ) // 创建实例 func newDB() (*gorm.DB, error) { if _db != nil { return _db, nil } dsn := os.Getenv("POSTGRES_DSN") if dsn == "" { dsn = "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable TimeZone=Asia/Shanghai" } maxLifetime := func() int { c := os.Getenv("MAXLIFETIME") cc, err := strconv.Atoi(c) if err != nil { return 1 } if cc <= 0 { return 1 } if cc >= 1000 { cc = 1000 } return cc }() maxIdleConns := func() int { c := os.Getenv("MAXIDLECONNS") cc, err := strconv.Atoi(c) if err != nil { return 1 } if cc < 0 { return 0 } if cc >= 1000 { cc = 1000 } return cc }() maxOpenConns := func() int { c := os.Getenv("MAXOPENCONNS") cc, err := strconv.Atoi(c) if err != nil { return 1 } if cc < 0 { return 0 } if cc >= 1000 { cc = 1000 } return cc }() var err error _db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{ SkipDefaultTransaction: true, Logger: logger.Default.LogMode(logger.Silent), NamingStrategy: schema.NamingStrategy{ SingularTable: true, }, }) if err != nil { return nil, err } _db.Use( dbresolver.Register(dbresolver.Config{ Sources: []gorm.Dialector{postgres.Open(dsn)}, Replicas: []gorm.Dialector{postgres.Open(dsn)}, Policy: dbresolver.RandomPolicy{}, }).SetConnMaxIdleTime(time.Hour). SetConnMaxLifetime(time.Duration(maxLifetime) * time.Hour). SetMaxIdleConns(maxIdleConns). SetMaxOpenConns(maxOpenConns)) return _db, nil }