Files
mayfly-go/server/internal/db/dbm/dbi/meta.go

64 lines
1.7 KiB
Go
Raw Normal View History

package dbi
import (
"database/sql"
)
var (
2024-12-08 13:04:23 +08:00
metas = make(map[DbType]Meta)
metaInit = make(map[DbType]bool)
)
type DbVersion string
2024-12-08 13:04:23 +08:00
// Meta 数据库元信息如获取sql.DB、Dialect等
type Meta interface {
// GetSqlDb 根据数据库信息获取sql.DB
GetSqlDb(*DbInfo) (*sql.DB, error)
2024-12-08 13:04:23 +08:00
// GetDialect 获取数据库方言, 若一些接口不需要DbConn则可以传nil
GetDialect(*DbConn) Dialect
2024-03-15 13:31:53 +08:00
// GetMetadata 获取元数据信息接口
// @param *DbConn 数据库连接
GetMetadata(*DbConn) Metadata
2024-12-08 13:04:23 +08:00
// GetDbDataTypes 获取所有数据库对应的数据类型
GetDbDataTypes() []*DbDataType
// GetCommonTypeConverter 获取公共类型转换器,用于迁移与同步
GetCommonTypeConverter() CommonTypeConverter
}
// 注册数据库类型与dbmeta
func Register(dt DbType, meta Meta) {
metas[dt] = meta
metaInit[dt] = false
}
// 根据数据库类型获取对应的Meta
func GetMeta(dt DbType) Meta {
// 未初始化,则进行初始化,如注册数据库类型等。防止未使用到的数据库都被注册
if inited := metaInit[dt]; !inited {
initMeta(dt, metas[dt])
}
return metas[dt]
}
// GetDialect 获取数据库方言如果dialect方法内需要用到dbConn的则不支持该方法
func GetDialect(dt DbType) Dialect {
// 创建一个假连接仅用于调用方言生成sql不做数据库连接操作
meta := GetMeta(dt)
dbConn := &DbConn{Info: &DbInfo{
Type: dt,
Meta: meta,
}}
return meta.GetDialect(dbConn)
}
// initMeta 初始化数据库类型,如注册数据库类型等
func initMeta(dt DbType, meta Meta) {
registerColumnDbDataTypes(dt, meta.GetDbDataTypes()...)
registerCommonTypeConverter(dt, meta.GetCommonTypeConverter())
}