package database import ( "database/sql" "fmt" "sync" "weatherstation/internal/config" _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" ) var ( instance *sql.DB once sync.Once ) // GetDB 返回数据库连接单例 func GetDB() *sql.DB { once.Do(func() { cfg := config.GetConfig() connStr := fmt.Sprintf( "host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", cfg.Database.Host, cfg.Database.Port, cfg.Database.User, cfg.Database.Password, cfg.Database.DBName, cfg.Database.SSLMode, ) var err error instance, err = sql.Open("postgres", connStr) if err != nil { panic(fmt.Sprintf("无法连接到数据库: %v", err)) } if err = instance.Ping(); err != nil { panic(fmt.Sprintf("数据库连接测试失败: %v", err)) } }) return instance } // Close 关闭数据库连接 func Close() error { if instance != nil { return instance.Close() } return nil } // -------------------- MySQL 连接(rtk_data) -------------------- var ( mysqlInstance *sql.DB mysqlOnce sync.Once ) // GetMySQL 返回 MySQL 连接单例(rtk_data) func GetMySQL() *sql.DB { mysqlOnce.Do(func() { cfg := config.GetConfig().MySQL var dsn string if cfg.Params != "" { dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName, cfg.Params) } else { dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName) } var err error mysqlInstance, err = sql.Open("mysql", dsn) if err != nil { panic(fmt.Sprintf("无法连接到 MySQL: %v", err)) } if err = mysqlInstance.Ping(); err != nil { panic(fmt.Sprintf("MySQL 连接测试失败: %v", err)) } }) return mysqlInstance } // CloseMySQL 关闭 MySQL 连接 func CloseMySQL() error { if mysqlInstance != nil { return mysqlInstance.Close() } return nil }