mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 23:40:24 +08:00
64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package dbi
|
||
|
||
import (
|
||
"database/sql"
|
||
)
|
||
|
||
var (
|
||
metas = make(map[DbType]Meta)
|
||
metaInit = make(map[DbType]bool)
|
||
)
|
||
|
||
type DbVersion string
|
||
|
||
// Meta 数据库元信息,如获取sql.DB、Dialect等
|
||
type Meta interface {
|
||
// GetSqlDb 根据数据库信息获取sql.DB
|
||
GetSqlDb(*DbInfo) (*sql.DB, error)
|
||
|
||
// GetDialect 获取数据库方言, 若一些接口不需要DbConn,则可以传nil
|
||
GetDialect(*DbConn) Dialect
|
||
|
||
// GetMetadata 获取元数据信息接口
|
||
// @param *DbConn 数据库连接
|
||
GetMetadata(*DbConn) Metadata
|
||
|
||
// 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())
|
||
}
|