51 lines
901 B
Go
51 lines
901 B
Go
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"sync"
|
|
"weatherstation/internal/config"
|
|
|
|
_ "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
|
|
}
|