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) BatchInsert(tx *sql.Tx, tableName string, columns []string, values [][]any) (int64, error)
// 获取数据转换器用于解析格式化列数据等
GetDataConverter() DataConverter GetDataConverter() DataConverter
CopyTable(copy *DbCopyTable) error CopyTable(copy *DbCopyTable) error

View File

@@ -2,6 +2,20 @@ package dbi
import "database/sql" 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等 // 数据库元信息获取如获取sql.DB、Dialect等
type Meta interface { type Meta interface {
// 根据数据库信息获取sql.DB // 根据数据库信息获取sql.DB

View File

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

View File

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

View File

@@ -6,19 +6,10 @@ import (
"mayfly-go/internal/db/dbm/dbi" "mayfly-go/internal/db/dbm/dbi"
"net/url" "net/url"
"strings" "strings"
"sync"
) )
var ( func init() {
meta dbi.Meta dbi.Register(dbi.DbTypeDM, new(DmMeta))
once sync.Once
)
func GetMeta() dbi.Meta {
once.Do(func() {
meta = new(DmMeta)
})
return meta
} }
type DmMeta struct { 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...) return md.dc.TxExec(tx, sqlStr, args...)
} }
func (md *MysqlDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
var ( var (
// 数字类型 // 数字类型
numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`) numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`)
@@ -216,10 +220,6 @@ var (
type DataConverter struct { type DataConverter struct {
} }
func (md *MysqlDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType { func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType {
if numberRegexp.MatchString(dbColumnType) { if numberRegexp.MatchString(dbColumnType) {
return dbi.DataTypeNumber return dbi.DataTypeNumber

View File

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

View File

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

View File

@@ -5,21 +5,12 @@ import (
"fmt" "fmt"
"mayfly-go/internal/db/dbm/dbi" "mayfly-go/internal/db/dbm/dbi"
"strings" "strings"
"sync"
go_ora "github.com/sijms/go-ora/v2" go_ora "github.com/sijms/go-ora/v2"
) )
var ( func init() {
meta dbi.Meta dbi.Register(dbi.DbTypeOracle, new(OraMeta))
once sync.Once
)
func GetMeta() dbi.Meta {
once.Do(func() {
meta = new(OraMeta)
})
return meta
} }
type OraMeta struct { 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...) return md.dc.TxExec(tx, sqlStr, args...)
} }
func (md *PgsqlDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
var ( var (
// 数字类型 // 数字类型
numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`) numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`)
@@ -236,10 +240,6 @@ var (
type DataConverter struct { type DataConverter struct {
} }
func (md *PgsqlDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType { func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType {
if numberRegexp.MatchString(dbColumnType) { if numberRegexp.MatchString(dbColumnType) {
return dbi.DataTypeNumber return dbi.DataTypeNumber

View File

@@ -9,22 +9,13 @@ import (
"mayfly-go/pkg/utils/netx" "mayfly-go/pkg/utils/netx"
"net" "net"
"strings" "strings"
"sync"
"time" "time"
pq "gitee.com/liuzongyang/libpq" pq "gitee.com/liuzongyang/libpq"
) )
var ( func init() {
meta dbi.Meta dbi.Register(dbi.DbTypePostgres, new(PostgresMeta))
once sync.Once
)
func GetMeta() dbi.Meta {
once.Do(func() {
meta = new(PostgresMeta)
})
return meta
} }
type PostgresMeta struct { 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...) return sd.dc.TxExec(tx, sqlStr, args...)
} }
func (sd *SqliteDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
var ( var (
// 数字类型 // 数字类型
numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit|real`) numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit|real`)
@@ -231,10 +235,6 @@ var (
type DataConverter struct { type DataConverter struct {
} }
func (sd *SqliteDialect) GetDataConverter() dbi.DataConverter {
return new(DataConverter)
}
func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType { func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType {
if numberRegexp.MatchString(dbColumnType) { if numberRegexp.MatchString(dbColumnType) {
return dbi.DataTypeNumber return dbi.DataTypeNumber

View File

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

View File

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