Files
mayfly-go/server/internal/db/dbm/dbi/metadata.go
2025-08-02 22:08:56 +08:00

124 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dbi
import (
"embed"
"mayfly-go/pkg/logx"
"mayfly-go/pkg/utils/collx"
"mayfly-go/pkg/utils/stringx"
"strings"
)
// Metadata 元数据接口(表、列、等元信息)
type Metadata interface {
// GetDbServer 获取数据库服务实例信息
GetDbServer() (*DbServer, error)
// GetCompatibleDbVersion 获取兼容版本信息,如果有兼容版本,则需要实现对应版本的特殊方言处理器,以及前端的方言兼容版本
GetCompatibleDbVersion() DbVersion
// GetDefaultDb 获取默认库
GetDefaultDb() string
// GetSchemas
GetSchemas() ([]string, error)
// GetDbNames 获取数据库名称列表
GetDbNames() ([]string, error)
// GetTables 获取表信息
GetTables(tableNames ...string) ([]Table, error)
// GetColumns 获取指定表名的所有列元信息
GetColumns(tableNames ...string) ([]Column, error)
// GetPrimaryKey 获取表主键字段名,没有主键标识则默认第一个字段
GetPrimaryKey(tableName string) (string, error)
// GetTableIndex 获取表索引信息
GetTableIndex(tableName string) ([]Index, error)
// GetTableDDL 获取建表ddl
GetTableDDL(tableName string, dropBeforeCreate bool) (string, error)
}
// 默认实现若需要覆盖则由各个数据库MetaData实现去覆盖重写
type DefaultMetadata struct {
}
func (dd *DefaultMetadata) GetCompatibleDbVersion() DbVersion {
return ""
}
func (dd *DefaultMetadata) GetDefaultDb() string {
return ""
}
// 数据库服务实例信息
type DbServer struct {
Version string `json:"version"` // 版本信息
Extra collx.M `json:"extra"` // 其他额外信息
}
// 表信息
type Table struct {
TableName string `json:"tableName"` // 表名
TableComment string `json:"tableComment"` // 表备注
CreateTime string `json:"createTime"` // 创建时间
TableRows int `json:"tableRows"`
DataLength int64 `json:"dataLength"`
IndexLength int64 `json:"indexLength"`
}
// 表索引信息
type Index struct {
IndexName string `json:"indexName"` // 索引名
ColumnName string `json:"columnName"` // 列名
IndexType string `json:"indexType"` // 索引类型
IndexComment string `json:"indexComment"` // 备注
SeqInIndex int `json:"seqInIndex"`
IsUnique bool `json:"isUnique"`
IsPrimaryKey bool `json:"isPrimaryKey"` // 是否是主键索引,某些情况需要判断并过滤掉主键索引
Extra collx.M `json:"extra"` // 其他额外信息,如索引列的前缀长度等
}
// ------------------------- 元数据sql操作 -------------------------
//
//go:embed metasql/*
var metasql embed.FS
// sql缓存 key: sql备注的key 如MYSQL_TABLE_MA value: sql内容
var sqlCache = make(map[string]string, 20)
// 获取本地文件的sql内容并进行解析获取对应key的sql内容
func GetLocalSql(file, key string) string {
sql := sqlCache[key]
if sql != "" {
return sql
}
bytes, err := metasql.ReadFile(file)
if err != nil {
logx.Error("failed to read sql metadata file: %s, err: %v", file, err)
return ""
}
allSql := string(bytes)
sqls := strings.Split(allSql, "---------------------------------------")
var resSql string
for _, sql := range sqls {
sql = stringx.TrimSpaceAndBr(sql)
// 获取sql第一行的sql备注信息如--MYSQL_TABLE_MA 表信息元数据
info := strings.SplitN(sql, "\n", 2)
// 原始sql即去除第一行的key与备注信息
rowSql := info[1]
// 获取sql keyMYSQL_TABLE_MA
sqlKey := strings.Split(strings.Split(info[0], " ")[0], "--")[1]
if key == sqlKey {
resSql = rowSql
}
sqlCache[sqlKey] = rowSql
}
return resSql
}