dbresolver

package module
v1.0.6 Latest Latest
Warning

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

Go to latest
Published: Nov 16, 2022 License: MIT Imports: 7 Imported by: 0

README

DBResolver

DBResolver for gorm v1. This adds functionality to switch between read and write databases.

Repo

Quick Start

Importing
go get github.com/go-gorm-v1/dbresolver@v1.0.3 
Usage
import (
  "github.com/go-gorm-v1/dbresolver"
  "github.com/jinzhu/gorm"
  _ "github.com/mattn/go-sqlite3"
)

func setDatabaseDefaults(db *gorm.DB) {
	db.DB().SetMaxIdleConns(MAX_IDLE_CONNECTIONS)
	db.DB().SetConnMaxLifetime(CONN_MAX_LIFETIME)
	db.DB().SetMaxOpenConns(MAX_OPEN_CONNECTIONS)
	db.LogMode(true)
}

func Setup() *dbresolver.Database {
    masterDB, err := gorm.Open("sqlite3", "./testdbs/users_write.db")
    if err != nil {
      log.Fatal("failed to connect to db", err)
    }

    setDatabaseDefaults(masterDB)

    replicaDBs := []*gorm.DB{}
    
    replica, err := gorm.Open("sqlite3", "./testdbs/users_read_a.db")
    if err != nil {
      log.Fatal("failed to connect to db", err)
    }

    setDatabaseDefaults(replica)

    replicaDBs = append(replicaDBs, replica)

    replica, err = gorm.Open("sqlite3", "./testdbs/users_read_b.db")
    if err != nil {
      log.Fatal("failed to connect to db", err)
    }

    setDatabaseDefaults(replica)

    replicaDBs = append(replicaDBs, replica)

    return dbresolver.Register(dbresolver.DBConfig{
        Master:   masterDB,
        Replicas: replicaDBs,
        // Policy: &dbresolver.RoundRobalancer{},
        // for existing database integration add this
        // DefaultMode: &dbresolver.DbWriteMode,
    })
}

db := Setup()

db.Raw(`SELECT * FROM users`)
Switching data source

It is possible to provide the option to use read or write forcefully.

// Raw By default uses read db
db.Raw(`SELECT * FROM users`)

// Use write db
db.WithMode(dbresolver.DBWriteMode).Raw(`SELECT * FROM users`)

// Use read db
db.WithMode(dbresolver.DBReadMode).Exec(`DELETE FROM users`)

It is also possible to set the default mode to write mode.

This uses write mode for all Query methods apart from Where

  • Find
  • First
  • Last
  • Take
  • Count
dbresolver.DBConfig {
    DefaultMode: &dbresolver.DbWriteMode
}
Load Balancing

By default we have two balancers

// RandomBalancer
dbresolver.DBConfig{
    Policy: &dbresolver.RoundRobalancer{}
}

// RandomBalancer
dbresolver.DBConfig{
    Policy: &dbresolver.RandomBalancer{}
}

You can provide your own load balancer. The Balancer interface is defined as such

type Balancer interface {
    Get() int64
}

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	EventBeforeDBSelect string = "before::select_db"
	EventAfterDBSelect  string = "after:select_db"
	EventBeforeQueryRun string = "before::query_run"
)

Functions

This section is empty.

Types

type Balancer

type Balancer interface {
	Get() int64
}

type DBConfig

type DBConfig struct {
	Master      *gorm.DB
	Replicas    []*gorm.DB
	Policy      Balancer
	DefaultMode *DbActionMode
}

type Database

type Database struct {
	// this makes sure, calls like Save Update etc, goes through default source db
	*gorm.DB
	Config DBConfig
	Hooks  *hooks.EventStore
}

func Register

func Register(config DBConfig) *Database

func (*Database) Count added in v1.0.3

func (d *Database) Count(value interface{}) *gorm.DB

func (*Database) Exec

func (d *Database) Exec(sql string, values ...interface{}) *gorm.DB

func (*Database) Find added in v1.0.3

func (d *Database) Find(query interface{}, args ...interface{}) *gorm.DB

func (*Database) First added in v1.0.3

func (d *Database) First(query interface{}, args ...interface{}) *gorm.DB

func (*Database) Last added in v1.0.3

func (d *Database) Last(query interface{}, args ...interface{}) *gorm.DB

func (*Database) Raw

func (d *Database) Raw(sql string, values ...interface{}) *gorm.DB

func (*Database) Save added in v1.0.3

func (d *Database) Save(value interface{}) *gorm.DB

func (*Database) Take added in v1.0.3

func (d *Database) Take(query interface{}, args ...interface{}) *gorm.DB

func (*Database) Where

func (d *Database) Where(query interface{}, args ...interface{}) *gorm.DB

func (*Database) WithMode

func (d *Database) WithMode(dbMode DbActionMode) *gorm.DB

type DbActionMode

type DbActionMode string
var (
	DbWriteMode DbActionMode = "write"
	DbReadMode  DbActionMode = "read"
)

type RandomBalancer

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

func NewRandomBalancer

func NewRandomBalancer(resourceCount int) *RandomBalancer

func (*RandomBalancer) Get

func (r *RandomBalancer) Get() int64

type RoundRobalancer

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

func NewRoundRobalancer

func NewRoundRobalancer(resourceCount int) *RoundRobalancer

func (*RoundRobalancer) Get

func (r *RoundRobalancer) Get() int64

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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