kra/internal/data/system/auto_code.go

72 lines
2.1 KiB
Go

package system
import (
"context"
"kra/internal/biz/system"
"gorm.io/gorm"
)
type autoCodeRepo struct {
db *gorm.DB
}
// NewAutoCodeRepo 创建自动代码仓储
func NewAutoCodeRepo(db *gorm.DB) system.AutoCodeRepo {
return &autoCodeRepo{db: db}
}
// GetDB 获取所有数据库
func (r *autoCodeRepo) GetDB(ctx context.Context) ([]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, 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, 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
}