2024-01-12 13:15:30 +08:00
|
|
|
|
package dbi
|
|
|
|
|
|
|
2024-10-20 03:52:23 +00:00
|
|
|
|
import (
|
|
|
|
|
|
"database/sql"
|
|
|
|
|
|
)
|
2024-01-12 13:15:30 +08:00
|
|
|
|
|
2024-01-24 17:01:17 +08:00
|
|
|
|
var (
|
2024-12-08 13:04:23 +08:00
|
|
|
|
metas = make(map[DbType]Meta)
|
|
|
|
|
|
metaInit = make(map[DbType]bool)
|
2024-01-24 17:01:17 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2024-10-20 03:52:23 +00:00
|
|
|
|
type DbVersion string
|
|
|
|
|
|
|
2024-12-08 13:04:23 +08:00
|
|
|
|
// Meta 数据库元信息,如获取sql.DB、Dialect等
|
2024-01-12 13:15:30 +08:00
|
|
|
|
type Meta interface {
|
2024-11-01 17:27:22 +08:00
|
|
|
|
// GetSqlDb 根据数据库信息获取sql.DB
|
2024-01-12 13:15:30 +08:00
|
|
|
|
GetSqlDb(*DbInfo) (*sql.DB, error)
|
|
|
|
|
|
|
2024-12-08 13:04:23 +08:00
|
|
|
|
// GetDialect 获取数据库方言, 若一些接口不需要DbConn,则可以传nil
|
2024-01-12 13:15:30 +08:00
|
|
|
|
GetDialect(*DbConn) Dialect
|
2024-03-15 13:31:53 +08:00
|
|
|
|
|
2024-11-01 17:27:22 +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())
|
2024-01-12 13:15:30 +08:00
|
|
|
|
}
|