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 }