89 lines
1.8 KiB
Go
89 lines
1.8 KiB
Go
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
|
||
}
|