package global import ( "database/sql" "fmt" "time" "electricity_bill_calc/config" "electricity_bill_calc/logger" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/pgdialect" "github.com/uptrace/bun/driver/pgdriver" "go.uber.org/zap/zapcore" ) var ( DB *bun.DB ) func SetupDatabaseConnection() error { // connStr := fmt.Sprintf( // "host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Asia/Shanghai connect_timeout=0 tcp_user_timeout=180000", // config.DatabaseSettings.Host, // config.DatabaseSettings.User, // config.DatabaseSettings.Pass, // config.DatabaseSettings.DB, // config.DatabaseSettings.Port, // ) pgconn := pgdriver.NewConnector( pgdriver.WithNetwork("tcp"), pgdriver.WithAddr(fmt.Sprintf("%s:%d", config.DatabaseSettings.Host, config.DatabaseSettings.Port)), pgdriver.WithUser(config.DatabaseSettings.User), pgdriver.WithInsecure(true), pgdriver.WithPassword(config.DatabaseSettings.Pass), pgdriver.WithDatabase(config.DatabaseSettings.DB), pgdriver.WithDialTimeout(30*time.Second), pgdriver.WithReadTimeout(3*time.Minute), pgdriver.WithWriteTimeout(10*time.Minute), ) sqldb := sql.OpenDB(pgconn) DB = bun.NewDB(sqldb, pgdialect.New()) DB.AddQueryHook(logger.NewQueryHook(logger.QueryHookOptions{ LogSlow: 3 * time.Second, Logger: logger.Named("PG"), QueryLevel: zapcore.DebugLevel, ErrorLevel: zapcore.ErrorLevel, SlowLevel: zapcore.WarnLevel, ErrorTemplate: "{{.Operation}}[{{.Duration}}]: {{.Query}}: {{.Error}}", MessageTemplate: "{{.Operation}}[{{.Duration}}]: {{.Query}}", })) DB.SetMaxIdleConns(config.DatabaseSettings.MaxIdleConns) DB.SetMaxOpenConns(config.DatabaseSettings.MaxOpenConns) DB.SetConnMaxIdleTime(10 * time.Minute) DB.SetConnMaxLifetime(60 * time.Minute) DB.Ping() return nil }