bgorm

package module
v0.0.0-...-e4912e9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 9, 2024 License: MIT Imports: 8 Imported by: 0

README

bgorm

business gorm

# 测试
go test -count=2 -v -race ./...
package main

import (
    "crypto/md5"
    "encoding/json"
    "fmt"
    "github.com/qq1060656096/bgorm"
)

func main() {
    mdb := bgorm.DefaultDbManager
    dsn := "root:root@tcp(127.0.0.1:3306)/test_data_1?charset=utf8mb4&parseTime=True&loc=Local"
    dsn2 := "root:root@tcp(127.0.0.1:3306)/test_data_2?charset=utf8mb4&parseTime=True&loc=Local"
    // database 1
    db := bgorm.MustDbOpen(bgorm.DriverTypeMysql, dsn)
    dbSign := fmt.Sprintf("%s", md5.Sum([]byte(dsn)))
    mdb.Register("test_data_1", dbSign, db)
    // database 2
    db = bgorm.MustDbOpen(bgorm.DriverTypeMysql, dsn2)
    dbSign = fmt.Sprintf("%s", md5.Sum([]byte(dsn2)))
    mdb.Register("test_data_2", dbSign, db)
    
    db, err := mdb.Get("test_data_1")
    if err != nil {
    panic(err)
    }
    tools := []map[string]interface{}{}
    db.Raw("select tools_id,tenant_id from tools limit 2").Find(&tools)
    jsonBytes, err := json.Marshal(tools)
    if err != nil {
    panic(err)
    }
    fmt.Println(string(jsonBytes))
    // Output: [{"tenant_id":1,"tools_id":1},{"tenant_id":1,"tools_id":3}]
}

Documentation

Index

Examples

Constants

View Source
const (
	DriverTypeMysql    = "mysql"
	DriverTypeSqlite   = "sqlite"
	DriverTypePostgres = "postgres"
	DriverTypeMssql    = "mssql"
)

Variables

This section is empty.

Functions

func DbOpen

func DbOpen(driverType, dsn string) (*gorm.DB, error)

func ErrIsDbNotFound

func ErrIsDbNotFound(err error) bool

func ErrIsDbNotFoundInContext

func ErrIsDbNotFoundInContext(err error) bool

func ErrIsInputType

func ErrIsInputType(err error) bool

func GetBusinessDbFromContext

func GetBusinessDbFromContext(ctx context.Context) (*gorm.DB, error)

GetBusinessDbFromContext from context get business db

func GetDbFromContext

func GetDbFromContext(ctx context.Context, dbKey interface{}) (*gorm.DB, error)

GetDbFromContext retrieves *gorm.DB from context.Context

func GetDefaultDbFromContext

func GetDefaultDbFromContext(ctx context.Context) (*gorm.DB, error)

GetDefaultDbFromContext will retrieve the default *gorm.DB from the context.Context

func MustDbOpen

func MustDbOpen(driverType, dsn string) *gorm.DB

func MustGetBusinessDbFromContext

func MustGetBusinessDbFromContext(ctx context.Context) *gorm.DB

MustGetBusinessDbFromContext from context get business db

func MustGetDbFromContext

func MustGetDbFromContext(ctx context.Context, dbKey interface{}) *gorm.DB

MustGetDbFromContext retrieves *gorm.DB from context.Context, panics if not found

func MustGetDefaultDbFromContext

func MustGetDefaultDbFromContext(ctx context.Context) *gorm.DB

MustGetDefaultDbFromContext will retrieve the default *gorm.DB from the context.Context, panics if not found @param ctx context.Context @return *gorm.DB

func MustGetTenantDbFromContext

func MustGetTenantDbFromContext(ctx context.Context) (defaultDb *gorm.DB, businessDb *gorm.DB)

MustGetTenantDbFromContext from context get default db and business db @param ctx context.Context @return *gorm.DB defaultDb and businessDb

func MustWithBusinessDbContext

func MustWithBusinessDbContext(ctx context.Context, name string) context.Context

MustWithBusinessDbContext will inject the business *gorm.DB into the context.Context, panics if not found

func MustWithDefaultDbContext

func MustWithDefaultDbContext(ctx context.Context, name string) context.Context

MustWithDefaultDbContext will inject the default *gorm.DB into the context.Context, panics if not found @param ctx context.Context @param name string the name of the MultiDbManager.RegisterDb name @return context.Context

func MustWithTenantDbContext

func MustWithTenantDbContext(ctx context.Context, defaultName, businessName string) context.Context

MustWithTenantDbContext inject default db and business db into context @param ctx context.Context @param defaultName string of the MultiDbManager.RegisterDb name @param businessName string of the MultiDbManager.RegisterDb name @return context.Context

Example
package main

import (
	"context"
	"crypto/md5"
	"encoding/json"
	"fmt"
	"github.com/qq1060656096/bgorm"
)

func main() {
	mdb := bgorm.DefaultDbManager
	dsn := "root:root@tcp(127.0.0.1:3306)/test_data_1?charset=utf8mb4&parseTime=True&loc=Local"
	dsn2 := "root:root@tcp(127.0.0.1:3306)/test_data_2?charset=utf8mb4&parseTime=True&loc=Local"
	// database 1
	db := bgorm.MustDbOpen(bgorm.DriverTypeMysql, dsn)
	dbSign := fmt.Sprintf("%s", md5.Sum([]byte(dsn)))
	mdb.Register("test_data_1", dbSign, db)
	// database 2
	db = bgorm.MustDbOpen(bgorm.DriverTypeMysql, dsn2)
	dbSign = fmt.Sprintf("%s", md5.Sum([]byte(dsn2)))
	mdb.Register("test_data_2", dbSign, db)

	ctx := context.Background()
	ctx = bgorm.MustWithTenantDbContext(ctx, "test_data_1", "test_data_2")
	comDb, bizDb := bgorm.MustGetTenantDbFromContext(ctx)

	var tools []map[string]interface{}
	comDb.Raw("select tools_id,tenant_id from tools order by tools_id asc limit 2").Find(&tools)
	jsonBytes, err := json.Marshal(tools)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jsonBytes))

	var tools2 []map[string]interface{}
	bizDb.Raw("select tools_id,tenant_id from tools limit 2").Find(&tools2)
	jsonBytes, err = json.Marshal(tools2)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jsonBytes))
}
Output:

[{"tenant_id":1,"tools_id":1},{"tenant_id":2,"tools_id":2}]
[{"tenant_id":4,"tools_id":4},{"tenant_id":5,"tools_id":5}]

func WithBusinessDbContext

func WithBusinessDbContext(ctx context.Context, name string) (context.Context, error)

WithBusinessDbContext will inject the business *gorm.DB into the context.Context

func WithDbContext

func WithDbContext(ctx context.Context, dbKey interface{}, db *gorm.DB) context.Context

WithDbContext injects *gorm.DB into context.Context

func WithDefaultDbContext

func WithDefaultDbContext(ctx context.Context, name string) (context.Context, error)

WithDefaultDbContext will inject the default *gorm.DB into the context.Context @param ctx context.Context @param name string the name of the MultiDbManager.RegisterDb name @return context.Context @return error

Types

type DbManager

type DbManager interface {
	// Register a db with name and sign
	// @param name: db name
	// @param sign: db connection config sign, used to re-register db when connection config changed
	// @param db: gorm db instance
	Register(name string, sign string, db *gorm.DB)
	// Unregister remove db by name
	// @param name: db name
	// @return: true if db exists and removed, false if db not exists
	Unregister(name string) bool
	// Get get db by name
	// @param name: db name
	// @return: db instance and nil if db exists, nil and error if db not exists
	Get(name string) (*gorm.DB, error)
	// GetSign get db sign by name
	// @param name: db name
	// @return: db sign and nil if db exists, nil and error if db not exists
	GetSign(name string) (string, error)
	// Exists check if db exists by name
	// @param name: db name
	// @return: true if db exists, false if db not exists
	Exists(name string) bool
	// Count get db count
	Count() int
}

DbManager is a manager for multiple db instances

var (
	DefaultDbManager DbManager = NewMemoryDbManager()
)

func NewMemoryDbManager

func NewMemoryDbManager() DbManager

NewMemoryDbManager 创建一个新的 MemoryDbManager 实例

Example
package main

import (
	"crypto/md5"
	"encoding/json"
	"fmt"
	"github.com/qq1060656096/bgorm"
)

func main() {
	mdb := bgorm.NewMemoryDbManager()
	dsn := "root:root@tcp(127.0.0.1:3306)/test_data_1?charset=utf8mb4&parseTime=True&loc=Local"
	dsn2 := "root:root@tcp(127.0.0.1:3306)/test_data_2?charset=utf8mb4&parseTime=True&loc=Local"
	// database 1
	db := bgorm.MustDbOpen(bgorm.DriverTypeMysql, dsn)
	dbSign := fmt.Sprintf("%s", md5.Sum([]byte(dsn)))
	mdb.Register("test_data_1", dbSign, db)
	// database 2
	db = bgorm.MustDbOpen(bgorm.DriverTypeMysql, dsn2)
	dbSign = fmt.Sprintf("%s", md5.Sum([]byte(dsn2)))
	mdb.Register("test_data_2", dbSign, db)

	db, err := mdb.Get("test_data_1")
	if err != nil {
		panic(err)
	}
	tools := []map[string]interface{}{}
	db.Raw("select tools_id,tenant_id from tools limit 2").Find(&tools)
	jsonBytes, err := json.Marshal(tools)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jsonBytes))
}
Output:

[{"tenant_id":1,"tools_id":1},{"tenant_id":2,"tools_id":2}]

type MemoryDbManager

type MemoryDbManager struct {
	// contains filtered or unexported fields
}

MemoryDbManager 管理多个数据库实例

func (*MemoryDbManager) Count

func (m *MemoryDbManager) Count() int

Count 获取数据库实例数量

func (*MemoryDbManager) Exists

func (m *MemoryDbManager) Exists(name string) bool

Exists 检查数据库实例是否存在

func (*MemoryDbManager) Get

func (m *MemoryDbManager) Get(name string) (*gorm.DB, error)

Get 获取数据库实例

func (*MemoryDbManager) GetSign

func (m *MemoryDbManager) GetSign(name string) (string, error)

GetSign 获取数据库实例标识

func (*MemoryDbManager) Register

func (m *MemoryDbManager) Register(name, sign string, db *gorm.DB)

Register 注册数据库实例

func (*MemoryDbManager) String

func (m *MemoryDbManager) String() string

String 返回所有数据库实例及其标识的JSON字符串

func (*MemoryDbManager) Unregister

func (m *MemoryDbManager) Unregister(name string) bool

Unregister 注销数据库实例

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL