Skip to content

qq1060656096/bgorm

Repository files navigation

BGORM

BGORM是一个基于GORM的Golang数据库管理库,专为需要管理多个数据库连接的应用程序设计。它提供了数据库连接池的管理、惰性连接(懒加载)以及线程安全的数据库操作支持。

功能特点

  • 支持多种数据库:MySQL、PostgreSQL、SQLite、SQL Server
  • 惰性连接创建(仅在首次使用时创建连接)
  • 线程安全的连接管理
  • 支持连接池参数配置
  • 简洁的API接口
  • 高并发下的稳定性保证
  • 支持动态配置更新

使用场景

BGORM适用于多种需要管理多个数据库连接的应用场景,以下是几个典型应用示例:

电商系统

在电商系统中,通常需要处理不同类型的数据库:

  • 主数据库:存储订单、用户、商品等核心业务数据
  • 日志数据库:存储系统日志、用户行为等数据
  • 库存数据库:用于高频的库存操作,可能需要独立优化

BGORM允许您在应用程序中轻松管理这些不同的数据库连接,并在订单处理、库存管理、用户操作等各个业务流程中无缝切换使用不同的数据库。

多租户SaaS应用

对于SaaS应用,每个租户可能有独立的数据库:

  • 根据租户ID动态创建和管理数据库连接
  • 实现租户间数据隔离,提高安全性
  • 支持租户特定的数据库配置和优化

BGORM的惰性连接创建特性使其非常适合多租户场景,只有在实际需要使用时才会创建数据库连接,有效节约系统资源。

读写分离架构

在高并发系统中实现读写分离:

  • 主库:处理所有的写操作(INSERT、UPDATE、DELETE)
  • 从库:处理只读操作(SELECT),可以有多个从库分担读负载

BGORM让您可以轻松地在代码中区分读写操作,将它们分别路由到主库和从库,从而提升系统整体性能和可扩展性。

微服务架构

在微服务架构中,每个服务可能需要连接到不同的数据库:

  • 用户服务:连接用户数据库
  • 订单服务:连接订单数据库
  • 产品服务:连接产品数据库(可能使用不同类型的数据库,如PostgreSQL)

BGORM支持在同一应用内管理多种不同类型的数据库连接,非常适合微服务架构中需要访问不同数据源的场景。

安装

go get github.com/qq1060656096/bgorm

快速开始

基本使用

package main

import (
    "fmt"
    "github.com/qq1060656096/bgorm"
    "log"
)

func main() {
    // 创建配置
    config := &bgorm.Config{
        DSN:        "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True",
        DriverType: bgorm.DriverTypeMysql,
    }
    
    // 注册数据库配置
    err := bgorm.DefaultDBManager().Register("main", config)
    if err != nil {
        log.Fatal(err)
    }
    
    // 获取数据库连接
    db, err := bgorm.DefaultDBManager().GetDB("main")
    if err != nil {
        log.Fatal(err)
    }
    
    // 使用GORM进行数据库操作
    // db.Create(...), db.Find(...), etc.
    
    // 程序结束时关闭所有连接
    defer bgorm.DefaultDBManager().CloseAll()
}

配置连接池

maxIdleConns := 10
maxOpenConns := 100
maxLifetime := 3600 // 秒

config := &bgorm.Config{
    DSN:          "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True",
    DriverType:   bgorm.DriverTypeMysql,
    MaxIdleConns: &maxIdleConns,
    MaxOpenConns: &maxOpenConns,
    MaxLifetime:  &maxLifetime,
}

DSN 选项配置

BGORM 提供了灵活的 DSN(数据源名称)配置选项,使您能够轻松构建不同数据库类型的连接字符串。

使用 DSNOption 结构体

// 创建 MySQL DSN 选项
option := &bgorm.DSNOption{
    DriverType: bgorm.DriverTypeMysql,
    Host:       "127.0.0.1",
    Port:       3306,
    User:       "user",
    Password:   "password",
    DBName:     "dbname",
    Params:     map[string]string{
        "charset":   "utf8mb4",
        "parseTime": "True",
    },
}

// 获取构建的 DSN 字符串
dsnString := option.String()
// 结果: "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True"

// 在配置中使用
config := &bgorm.Config{
    DSN:        dsnString,
    DriverType: bgorm.DriverTypeMysql,
}

使用函数式选项模式

BGORM 也支持使用函数式选项模式来构建 DSN:

// 使用 NewDSN 函数和选项构建 MySQL DSN
dsnString := bgorm.NewDSN(
    bgorm.DriverTypeMysql,
    bgorm.WithHost("127.0.0.1"),
    bgorm.WithPort(3306),
    bgorm.WithUserPassword("user", "password"),
    bgorm.WithDBName("dbname"),
    bgorm.WithParams(map[string]string{
        "charset":   "utf8mb4",
        "parseTime": "True",
        "loc":       "Local",
    }),
)

// 在配置中使用
config := &bgorm.Config{
    DSN:        dsnString,
    DriverType: bgorm.DriverTypeMysql,
}

MySQL DSN 参数说明

MySQL DSN 支持多种参数配置,以下是常用参数:

参数名 说明 示例值
charset 字符集 utf8mb4
parseTime 是否解析时间 True
loc 时区设置 Local, UTC, Asia/Shanghai
timeout 连接超时时间(秒) 10s
readTimeout 读取超时时间 30s
writeTimeout 写入超时时间 30s
collation 字符序 utf8mb4_general_ci
multiStatements 是否允许多语句 true

示例:

params := map[string]string{
    "charset":         "utf8mb4",
    "parseTime":       "True",
    "loc":             "Asia/Shanghai",
    "timeout":         "10s",
    "readTimeout":     "30s",
    "writeTimeout":    "30s",
    "collation":       "utf8mb4_general_ci",
    "multiStatements": "true",
}

dsnString := bgorm.NewDSN(
    bgorm.DriverTypeMysql,
    bgorm.WithHost("127.0.0.1"),
    bgorm.WithPort(3306),
    bgorm.WithUserPassword("user", "password"),
    bgorm.WithDBName("dbname"),
    bgorm.WithParams(params),
)

支持多数据库

// 注册主数据库
mainConfig := &bgorm.Config{
    DSN:        "user:password@tcp(127.0.0.1:3306)/main_db?charset=utf8mb4",
    DriverType: bgorm.DriverTypeMysql,
}
bgorm.DefaultDBManager().Register("main", mainConfig)

// 注册分析数据库
analyticsConfig := &bgorm.Config{
    DSN:        "host=localhost port=5432 user=postgres dbname=analytics",
    DriverType: bgorm.DriverTypePostgres,
}
bgorm.DefaultDBManager().Register("analytics", analyticsConfig)

// 根据需要获取不同的数据库连接
mainDB, _ := bgorm.DefaultDBManager().GetDB("main")
analyticsDB, _ := bgorm.DefaultDBManager().GetDB("analytics")

API文档

DBManager

// 创建新的数据库管理器
manager := bgorm.NewDBManager()

// 获取默认的数据库管理器
manager := bgorm.DefaultDBManager()

注册数据库配置

// Register 注册一个数据库配置
// 注册后首次使用时才会创建数据库连接
err := manager.Register(name string, config *Config) error

获取数据库连接

// GetDB 获取指定名称的数据库连接
// 如果连接不存在但配置存在,则创建新连接
db, err := manager.GetDB(name string) (*gorm.DB, error)

关闭数据库连接

// Close 关闭指定的数据库连接
err := manager.Close(name string) error

// CloseAll 关闭所有数据库连接
err := manager.CloseAll() error

其他辅助方法

// HasDB 检查是否存在指定名称的数据库配置
exists := manager.HasDB(name string) bool

// GetDBNames 获取所有已注册的数据库名称
names := manager.GetDBNames() []string

// Unregister 注销指定名称的数据库配置
err := manager.Unregister(name string) error

// IsConnected 检查数据库是否已连接
connected := manager.IsConnected(name string) bool

动态配置更新

// StartPeriodicWriteConfig 启动周期性写入配置的定时器
// 参数说明:
// - m: 数据库管理器实例
// - d: 定时器触发的时间间隔
// - fn: 返回配置数组的函数,每次定时器触发时执行
// 返回一个停止函数,调用该函数可以停止定时器
stopFunc := bgorm.StartPeriodicWriteConfig(m *DBManager, d time.Duration, fn func() []*Config) func()

示例:

// 创建数据库管理器
manager := bgorm.DefaultDBManager()

// 定义配置生成函数
configGenerator := func() []*bgorm.Config {
    // 从配置中心、文件或其他来源获取最新配置
    return []*bgorm.Config{
        {
            DSN:        "user:pass@tcp(127.0.0.1:3306)/db1?charset=utf8mb4",
            DriverType: bgorm.DriverTypeMysql,
        },
        {
            DSN:        "user:pass@tcp(127.0.0.1:3306)/db2?charset=utf8mb4",
            DriverType: bgorm.DriverTypeMysql,
        },
    }
}

// 启动周期性配置更新(每60秒更新一次)
stopFunc := bgorm.StartPeriodicWriteConfig(manager, 60*time.Second, configGenerator)

// 在程序结束时停止定时器
defer stopFunc()

Config配置

type Config struct {
    DSN          string // 数据库连接字符串
    DriverType   string // 数据库驱动类型 (mysql, sqlite, postgres, sqlserver)
    MaxIdleConns *int   // 最大空闲连接数
    MaxOpenConns *int   // 最大打开连接数
    MaxLifetime  *int   // 连接最大生命周期(秒)
}

可用的驱动类型常量:

  • bgorm.DriverTypeMysql - MySQL数据库
  • bgorm.DriverTypeSqlite - SQLite数据库
  • bgorm.DriverTypePostgres - PostgreSQL数据库
  • bgorm.DriverTypeSqlServer - SQL Server数据库

运行单元测试

go test -count=1 -v .
go test -count=1 -race .

许可证

MIT

About

business gorm

Resources

License

Stars

Watchers

Forks

Packages

No packages published