refactor: 数据库meta使用注册方式,方便可插拔

This commit is contained in:
meilin.huang
2024-01-24 17:01:17 +08:00
parent bed95254d0
commit 7e9a381641
14 changed files with 55 additions and 99 deletions

View File

@@ -115,6 +115,7 @@ type Dialect interface {
// 批量保存数据
BatchInsert(tx *sql.Tx, tableName string, columns []string, values [][]any) (int64, error)
// 获取数据转换器用于解析格式化列数据等
GetDataConverter() DataConverter
CopyTable(copy *DbCopyTable) error

View File

@@ -2,6 +2,20 @@ package dbi
import "database/sql"
var (
metas map[DbType]Meta = make(map[DbType]Meta)
)
// 注册数据库类型与dbmeta
func Register(dt DbType, meta Meta) {
metas[dt] = meta
}
// 根据数据库类型获取对应的Meta
func GetMeta(dt DbType) Meta {
return metas[dt]
}
// 数据库元信息获取如获取sql.DB、Dialect等
type Meta interface {
// 根据数据库信息获取sql.DB

View File

@@ -4,11 +4,11 @@ import (
"fmt"
"mayfly-go/internal/common/consts"
"mayfly-go/internal/db/dbm/dbi"
"mayfly-go/internal/db/dbm/dm"
"mayfly-go/internal/db/dbm/mysql"
"mayfly-go/internal/db/dbm/oracle"
"mayfly-go/internal/db/dbm/postgres"
"mayfly-go/internal/db/dbm/sqlite"
_ "mayfly-go/internal/db/dbm/dm"
_ "mayfly-go/internal/db/dbm/mysql"
_ "mayfly-go/internal/db/dbm/oracle"
_ "mayfly-go/internal/db/dbm/postgres"
_ "mayfly-go/internal/db/dbm/sqlite"
"mayfly-go/internal/machine/mcm"
"mayfly-go/pkg/cache"
"mayfly-go/pkg/logx"
@@ -39,23 +39,6 @@ func init() {
var mutex sync.Mutex
func getDbMetaByType(dt dbi.DbType) dbi.Meta {
switch dt {
case dbi.DbTypeMysql, dbi.DbTypeMariadb:
return mysql.GetMeta()
case dbi.DbTypePostgres:
return postgres.GetMeta()
case dbi.DbTypeDM:
return dm.GetMeta()
case dbi.DbTypeOracle:
return oracle.GetMeta()
case dbi.DbTypeSqlite:
return sqlite.GetMeta()
default:
panic(fmt.Sprintf("invalid database type: %s", dt))
}
}
// 从缓存中获取数据库连接信息若缓存中不存在则会使用回调函数获取dbInfo进行连接并缓存
func GetDbConn(dbId uint64, database string, getDbInfo func() (*dbi.DbInfo, error)) (*dbi.DbConn, error) {
connId := dbi.GetDbConnId(dbId, database)
@@ -92,7 +75,7 @@ func GetDbConn(dbId uint64, database string, getDbInfo func() (*dbi.DbInfo, erro
// 使用指定dbInfo信息进行连接
func Conn(di *dbi.DbInfo) (*dbi.DbConn, error) {
return di.Conn(getDbMetaByType(di.Type))
return di.Conn(dbi.GetMeta(di.Type))
}
// 根据实例id获取连接

View File

@@ -4,7 +4,6 @@ import (
"context"
"database/sql"
"fmt"
"github.com/kanzihuang/vitess/go/vt/sqlparser"
"mayfly-go/internal/db/dbm/dbi"
"mayfly-go/pkg/errorx"
"mayfly-go/pkg/logx"
@@ -15,6 +14,8 @@ import (
"strings"
"time"
"github.com/kanzihuang/vitess/go/vt/sqlparser"
_ "gitee.com/chunanyong/dm"
)
@@ -291,13 +292,13 @@ func (dd *DMDialect) BatchInsert(tx *sql.Tx, tableName string, columns []string,
return int64(effRows), nil
}
type DataConverter struct {
}
func (dd *DMDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
type DataConverter struct {
}
func (dd *DataConverter) GetDataType(dbColumnType string) dbi.DataType {
if numberRegexp.MatchString(dbColumnType) {
return dbi.DataTypeNumber

View File

@@ -6,19 +6,10 @@ import (
"mayfly-go/internal/db/dbm/dbi"
"net/url"
"strings"
"sync"
)
var (
meta dbi.Meta
once sync.Once
)
func GetMeta() dbi.Meta {
once.Do(func() {
meta = new(DmMeta)
})
return meta
func init() {
dbi.Register(dbi.DbTypeDM, new(DmMeta))
}
type DmMeta struct {

View File

@@ -202,6 +202,10 @@ func (md *MysqlDialect) BatchInsert(tx *sql.Tx, tableName string, columns []stri
return md.dc.TxExec(tx, sqlStr, args...)
}
func (md *MysqlDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
var (
// 数字类型
numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`)
@@ -216,10 +220,6 @@ var (
type DataConverter struct {
}
func (md *MysqlDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType {
if numberRegexp.MatchString(dbColumnType) {
return dbi.DataTypeNumber

View File

@@ -6,21 +6,14 @@ import (
"fmt"
"mayfly-go/internal/db/dbm/dbi"
"net"
"sync"
"github.com/go-sql-driver/mysql"
)
var (
meta dbi.Meta
once sync.Once
)
func GetMeta() dbi.Meta {
once.Do(func() {
meta = new(MysqlMeta)
})
return meta
func init() {
meta := new(MysqlMeta)
dbi.Register(dbi.DbTypeMysql, meta)
dbi.Register(dbi.DbTypeMariadb, meta)
}
type MysqlMeta struct {

View File

@@ -292,6 +292,10 @@ func (od *OracleDialect) BatchInsert(tx *sql.Tx, tableName string, columns []str
return res, err
}
func (od *OracleDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
var (
// 数字类型
numberTypeRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`)
@@ -302,10 +306,6 @@ var (
type DataConverter struct {
}
func (od *OracleDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType {
if numberTypeRegexp.MatchString(dbColumnType) {
return dbi.DataTypeNumber

View File

@@ -5,21 +5,12 @@ import (
"fmt"
"mayfly-go/internal/db/dbm/dbi"
"strings"
"sync"
go_ora "github.com/sijms/go-ora/v2"
)
var (
meta dbi.Meta
once sync.Once
)
func GetMeta() dbi.Meta {
once.Do(func() {
meta = new(OraMeta)
})
return meta
func init() {
dbi.Register(dbi.DbTypeOracle, new(OraMeta))
}
type OraMeta struct {

View File

@@ -222,6 +222,10 @@ func (md *PgsqlDialect) BatchInsert(tx *sql.Tx, tableName string, columns []stri
return md.dc.TxExec(tx, sqlStr, args...)
}
func (md *PgsqlDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
var (
// 数字类型
numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`)
@@ -236,10 +240,6 @@ var (
type DataConverter struct {
}
func (md *PgsqlDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType {
if numberRegexp.MatchString(dbColumnType) {
return dbi.DataTypeNumber

View File

@@ -9,22 +9,13 @@ import (
"mayfly-go/pkg/utils/netx"
"net"
"strings"
"sync"
"time"
pq "gitee.com/liuzongyang/libpq"
)
var (
meta dbi.Meta
once sync.Once
)
func GetMeta() dbi.Meta {
once.Do(func() {
meta = new(PostgresMeta)
})
return meta
func init() {
dbi.Register(dbi.DbTypePostgres, new(PostgresMeta))
}
type PostgresMeta struct {

View File

@@ -221,6 +221,10 @@ func (sd *SqliteDialect) BatchInsert(tx *sql.Tx, tableName string, columns []str
return sd.dc.TxExec(tx, sqlStr, args...)
}
func (sd *SqliteDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
var (
// 数字类型
numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit|real`)
@@ -231,10 +235,6 @@ var (
type DataConverter struct {
}
func (sd *SqliteDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType {
if numberRegexp.MatchString(dbColumnType) {
return dbi.DataTypeNumber

View File

@@ -5,19 +5,10 @@ import (
"errors"
"mayfly-go/internal/db/dbm/dbi"
"os"
"sync"
)
var (
meta dbi.Meta
once sync.Once
)
func GetMeta() dbi.Meta {
once.Do(func() {
meta = new(SqliteMeta)
})
return meta
func init() {
dbi.Register(dbi.DbTypeSqlite, new(SqliteMeta))
}
type SqliteMeta struct {

View File

@@ -26,7 +26,7 @@ func (c *Container) Register(bean any, opts ...ComponentOption) {
componentName := component.Name
cType := structx.IndirectType(reflect.TypeOf(component.Value))
// 组件名为空,则组件类型名称作为组件名
// 组件名为空,则组件类型名称作为组件名
if componentName == "" {
componentName = cType.Name()
component.Name = componentName