dbresolver is sqlx resolver and wrapper for database cluster.
go get github.com/proost/dbresolverpackage main
import (
"context""fmt""log""github.com/jmoiron/sqlx""github.com/proost/dbresolver"
)
funcmain() {
var (
primaryHost="localhost"primaryPort=3306primaryUser="primary"primaryPassword="<password>"secondaryHost="localhost"secondaryPort=3307secondaryUser="secondary"secondaryPassword="<password>"dbname="<dbname>"
)
// DSNsprimaryDSN:=fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s",
primaryUser,
primaryPassword,
primaryHost,
primaryPort,
dbname,
)
secondaryDSN:=fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s",
secondaryUser,
secondaryPassword,
secondaryHost,
secondaryPort,
dbname,
)
// connect to primaryprimaryDB:=sqlx.MustOpen("mysql", primaryDSN)
// connect to secondarysecondaryDB:=sqlx.MustOpen("mysql", secondaryDSN)
primaryDBsCfg:=&dbresolver.PrimaryDBsConfig{
DBs: []*sqlx.DB{primaryDB},
ReadWritePolicy: dbresolver.ReadWrite,
}
resolver:=dbresolver.MustNewDBResolver(primaryDBsCfg, dbresolver.WithSecondaryDBs(secondaryDB))
deferresolver.Close()
resolver.MustExecContext(context.Background(), "INSERT INTO users (name) VALUES (?)", "foo")
result, err:=resolver.QueryxContext(context.Background(), `SELECT * FROM users WHERE name = "foo"`)
iferr!=nil {
log.Panic(err)
}
fmt.Println(result)
}- Primary Database will be used when you call these functions
BeginBeginTxBeginTxxBeginxConnConnxExecExecContextMustBeginMustBeginTxMustExecMustExecContextNamedExecNamedExecContext
- Readable Database(Secondary Database or Primary Database depending on configuration) will be used when you call these functions
GetGetContextNamedQueryNamedQueryContextQueryQueryContextQueryRowQueryRowContextQueryRowxQueryRowxContextSelectSelectContext
To contribute to this project, you can open a PR or an issue.