mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-04 00:10:25 +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)
|
BatchInsert(tx *sql.Tx, tableName string, columns []string, values [][]any) (int64, error)
|
||||||
|
|
||||||
|
// 获取数据转换器用于解析格式化列数据等
|
||||||
GetDataConverter() DataConverter
|
GetDataConverter() DataConverter
|
||||||
|
|
||||||
CopyTable(copy *DbCopyTable) error
|
CopyTable(copy *DbCopyTable) error
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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获取连接
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user