kra/internal/data/system/auto_code.go

125 lines
3.5 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 system
import (
"context"
"kra/internal/biz/system"
"kra/internal/conf"
"gorm.io/gorm"
)
type autoCodeRepo struct {
db *gorm.DB
dbName string
conf *conf.Bootstrap
}
// NewAutoCodeRepo 创建自动代码仓储
func NewAutoCodeRepo(db *gorm.DB, conf *conf.Bootstrap) system.AutoCodeRepo {
// 获取默认数据库名
dbName := ""
if conf.Mysql != nil && conf.Mysql.DbName != "" {
dbName = conf.Mysql.DbName
} else if conf.Pgsql != nil && conf.Pgsql.DbName != "" {
dbName = conf.Pgsql.DbName
} else if conf.Sqlite != nil && conf.Sqlite.DbName != "" {
dbName = conf.Sqlite.DbName
}
return &autoCodeRepo{
db: db,
dbName: dbName,
conf: conf,
}
}
// GetDB 获取所有数据库
func (r *autoCodeRepo) GetDB(ctx context.Context, businessDB string) ([]system.Db, error) {
var entities []system.Db
sql := "SELECT SCHEMA_NAME AS `database` FROM INFORMATION_SCHEMA.SCHEMATA;"
err := r.db.WithContext(ctx).Raw(sql).Scan(&entities).Error
return entities, err
}
// GetTables 获取指定数据库的所有表
func (r *autoCodeRepo) GetTables(ctx context.Context, businessDB, dbName string) ([]system.Table, error) {
var entities []system.Table
sql := `SELECT table_name AS table_name FROM information_schema.tables WHERE table_schema = ?`
err := r.db.WithContext(ctx).Raw(sql, dbName).Scan(&entities).Error
return entities, err
}
// GetColumn 获取指定表的所有列
func (r *autoCodeRepo) GetColumn(ctx context.Context, businessDB, tableName, dbName string) ([]system.Column, error) {
var entities []system.Column
sql := `
SELECT
c.COLUMN_NAME column_name,
c.DATA_TYPE data_type,
CASE c.DATA_TYPE
WHEN 'longtext' THEN c.CHARACTER_MAXIMUM_LENGTH
WHEN 'varchar' THEN c.CHARACTER_MAXIMUM_LENGTH
WHEN 'double' THEN CONCAT_WS(',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE)
WHEN 'decimal' THEN CONCAT_WS(',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE)
WHEN 'int' THEN c.NUMERIC_PRECISION
WHEN 'bigint' THEN c.NUMERIC_PRECISION
ELSE ''
END AS data_type_long,
c.COLUMN_COMMENT column_comment,
CASE WHEN kcu.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END AS primary_key,
c.ORDINAL_POSITION
FROM
INFORMATION_SCHEMA.COLUMNS c
LEFT JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
ON
c.TABLE_SCHEMA = kcu.TABLE_SCHEMA
AND c.TABLE_NAME = kcu.TABLE_NAME
AND c.COLUMN_NAME = kcu.COLUMN_NAME
AND kcu.CONSTRAINT_NAME = 'PRIMARY'
WHERE
c.TABLE_NAME = ?
AND c.TABLE_SCHEMA = ?
ORDER BY
c.ORDINAL_POSITION;`
err := r.db.WithContext(ctx).Raw(sql, tableName, dbName).Scan(&entities).Error
return entities, err
}
// GetDBList 获取配置的数据库列表
func (r *autoCodeRepo) GetDBList() []system.DBInfo {
// 目前KRA只支持单数据库配置返回主数据库信息
var dbList []system.DBInfo
if r.conf.Mysql != nil && r.conf.Mysql.DbName != "" {
dbList = append(dbList, system.DBInfo{
AliasName: "",
DBName: r.conf.Mysql.DbName,
Disable: false,
DBType: "mysql",
})
}
if r.conf.Pgsql != nil && r.conf.Pgsql.DbName != "" {
dbList = append(dbList, system.DBInfo{
AliasName: "",
DBName: r.conf.Pgsql.DbName,
Disable: false,
DBType: "pgsql",
})
}
if r.conf.Sqlite != nil && r.conf.Sqlite.DbName != "" {
dbList = append(dbList, system.DBInfo{
AliasName: "",
DBName: r.conf.Sqlite.DbName,
Disable: false,
DBType: "sqlite",
})
}
return dbList
}
// GetActiveDBName 获取当前活动的数据库名
func (r *autoCodeRepo) GetActiveDBName(businessDB string) string {
// 目前KRA只支持单数据库直接返回配置的数据库名
return r.dbName
}