mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 07:20:24 +08:00
refactor: 数据库meta使用注册方式,方便可插拔
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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获取连接
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user