package database import ( "fmt" "github.com/emsoft/HospitalPay-Go/internal/config" "github.com/emsoft/HospitalPay-Go/internal/pkg/logger" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/schema" ) var DB *gorm.DB // Init 初始化数据库连接 func Init() error { var err error dbConfig := config.GlobalConfig.Database dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=%v&loc=%s", dbConfig.Username, dbConfig.Password, dbConfig.Host, dbConfig.Port, dbConfig.DBName, dbConfig.Charset, dbConfig.ParseTime, dbConfig.Loc, ) DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ TablePrefix: "t_", // 表名前缀 SingularTable: true, // 使用单数表名 }, Logger: NewGormLogger(), }) if err != nil { return fmt.Errorf("connect to database failed: %v", err) } // 设置连接池 sqlDB, err := DB.DB() if err != nil { return fmt.Errorf("get db instance failed: %v", err) } sqlDB.SetMaxIdleConns(dbConfig.MaxIdleConns) sqlDB.SetMaxOpenConns(dbConfig.MaxOpenConns) sqlDB.SetConnMaxLifetime(dbConfig.ConnMaxLifetime) // 测试连接 if err := sqlDB.Ping(); err != nil { return fmt.Errorf("ping database failed: %v", err) } logger.Info("Database connected successfully") return nil } // GetDB 获取数据库连接 func GetDB() *gorm.DB { return DB } // Close 关闭数据库连接 func Close() error { sqlDB, err := DB.DB() if err != nil { return err } return sqlDB.Close() } // Transaction 事务处理 func Transaction(fn func(tx *gorm.DB) error) error { return DB.Transaction(fn) }