refactor: 优化数据库初始化逻辑,使用 sync.Once 确保 GormDB 只初始化一次,避免db查空

This commit is contained in:
lixiangwuxian 2025-07-05 16:58:04 +08:00
parent e84d64100c
commit c50ca47911
2 changed files with 11 additions and 5 deletions

View File

@ -55,7 +55,6 @@ func main() {
}() }()
defer exec.DockerContainer.RemoveContainer() defer exec.DockerContainer.RemoveContainer()
defer sqlite3.CloseDB() defer sqlite3.CloseDB()
sqlite3.InitGormDB()
go func() { go func() {
const reconnectDelay = 5 * time.Second const reconnectDelay = 5 * time.Second
for !stopRun { for !stopRun {

View File

@ -1,12 +1,16 @@
package sqlite3 package sqlite3
import ( import (
"sync"
"gorm.io/driver/sqlite" "gorm.io/driver/sqlite"
"gorm.io/gorm" "gorm.io/gorm"
) )
var db *gorm.DB var db *gorm.DB
var OnceInitGormDB sync.Once
func InitGormDB() { func InitGormDB() {
var err error var err error
db, err = gorm.Open(sqlite.Open("data.db"), &gorm.Config{}) db, err = gorm.Open(sqlite.Open("data.db"), &gorm.Config{})
@ -16,27 +20,30 @@ func InitGormDB() {
} }
func GetGormDB() *gorm.DB { func GetGormDB() *gorm.DB {
if db == nil {
OnceInitGormDB.Do(InitGormDB)
}
return db return db
} }
// TryCreateTable 使用GORM执行原始SQL创建表语句 // TryCreateTable 使用GORM执行原始SQL创建表语句
func TryCreateTable(query string) error { func TryCreateTable(query string) error {
return db.Exec(query).Error return GetGormDB().Exec(query).Error
} }
// AutoMigrate 使用GORM的自动迁移功能 // AutoMigrate 使用GORM的自动迁移功能
func AutoMigrate(models ...interface{}) error { func AutoMigrate(models ...interface{}) error {
return db.AutoMigrate(models...) return GetGormDB().AutoMigrate(models...)
} }
// GetGormTx 获取GORM事务 // GetGormTx 获取GORM事务
func GetGormTx() *gorm.DB { func GetGormTx() *gorm.DB {
return db.Begin() return GetGormDB().Begin()
} }
// CloseDB 关闭数据库连接 // CloseDB 关闭数据库连接
func CloseDB() { func CloseDB() {
if sqlDB, err := db.DB(); err == nil { if sqlDB, err := GetGormDB().DB(); err == nil {
sqlDB.Close() sqlDB.Close()
} }
} }