package system import ( "context" "gorm.io/gorm" ) // AutoCodeMysql MySQL适配器 type AutoCodeMysql struct { db *gorm.DB dbList map[string]*gorm.DB } // NewAutoCodeMysql 创建MySQL适配器 func NewAutoCodeMysql(db *gorm.DB, dbList map[string]*gorm.DB) *AutoCodeMysql { return &AutoCodeMysql{ db: db, dbList: dbList, } } // GetDB 获取数据库的所有数据库名 func (s *AutoCodeMysql) GetDB(ctx context.Context) ([]Db, error) { var entities []Db sql := "SELECT SCHEMA_NAME AS `database` FROM INFORMATION_SCHEMA.SCHEMATA;" err := s.db.WithContext(ctx).Raw(sql).Scan(&entities).Error return entities, err } // GetTables 获取数据库的所有表名 func (s *AutoCodeMysql) GetTables(ctx context.Context, dbName string) ([]Table, error) { var entities []Table sql := `select table_name as table_name from information_schema.tables where table_schema = ?` err := s.db.WithContext(ctx).Raw(sql, dbName).Scan(&entities).Error return entities, err } // GetColumn 获取指定数据库和指定数据表的所有字段名,类型值等 func (s *AutoCodeMysql) GetColumn(ctx context.Context, tableName, dbName string) ([]Column, error) { var entities []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 := s.db.WithContext(ctx).Raw(sql, tableName, dbName).Scan(&entities).Error return entities, err }