import pymysql class DatabaseInfo: def __init__(self, host, user, port, password, database): self.host = host self.port = port self.user = user self.password = password self.database = database self.connection = None def __enter__(self): self.connect() return self def __exit__(self, exc_type, exc_val, exc_tb): self.disconnect() def connect(self): try: self.connection = pymysql.connect( host=self.host, port=self.port, user=self.user, password=self.password, database=self.database ) except pymysql.Error as e: print(f"数据库连接失败: {e}") def disconnect(self): if self.connection: self.connection.close() def get_all_tables(self): if not self.connection: self.connect() try: with self.connection.cursor() as cursor: cursor.execute("SHOW TABLE STATUS") tables = cursor.fetchall() table_info_list = [] for table in tables: table_info = { "tableName": table[0], "tableComment": table[17] # 表注释信息在第 19 列(索引为 18) } table_info_list.append(table_info) return table_info_list except pymysql.Error as e: print(f"获取表名失败: {e}") return [] def get_table_info(self, table_name): if not self.connection: self.connect() try: with self.connection.cursor() as cursor: cursor.execute("SHOW TABLE STATUS LIKE %s", (table_name,)) table = cursor.fetchone() table_info = { "tableName": table[0], "tableComment": table[17] # 表注释信息在第 19 列(索引为 18) } return table_info except pymysql.Error as e: print(f"获取表名失败: {e}") return {} def parse_type_and_validation(self, column_type): # 简单的类型解析,实际可能需要更复杂的逻辑 if "int" in column_type.lower(): return dict(type="int", validation="int") elif "varchar" in column_type.lower(): number = column_type.split("(")[1].split(")")[0].strip() return dict(type="str", validations=[ dict(type="str", min=1, max=int(number)) ]) # elif "datetime" in column_type.lower(): # return dict(type="str", validations=[ # dict(type="str", format="%Y-%m-%d %H:%M:%S") # ]) else: return dict(type=column_type) def get_table_structure(self, table_name): if not self.connection: self.connect() try: table_info = self.get_table_info(table_name) with self.connection.cursor() as cursor: # 使用 SHOW FULL COLUMNS FROM 获取包含注释的列信息 cursor.execute(f"SHOW FULL COLUMNS FROM {table_name}") columns = cursor.fetchall() structure = [] for column in columns: column_info = { "name": column[0], "type": column[1], "required": column[2] is not None, "primary_key": column[4] == 'PRI', # "default": column[4], "description": column[8] # 注释信息在第 9 列(索引为 8) } column_info.update(self.parse_type_and_validation(column_info["type"])) # 添加解析后的类型和验证信息 structure.append(column_info) table_info['fields'] = structure return table_info except pymysql.Error as e: print(f"获取表 {table_name} 结构失败: {e}") return {'fields': []} if __name__ == "__main__": # 请根据实际情况修改数据库连接信息 db_info = DatabaseInfo( host="lt.330770.xyz", port=3307, user="root", password="rap_sky", database="rpa" ) tables = db_info.get_all_tables() print("所有表名:") for table in tables: print(table) tableName = table.get('TableName') structure = db_info.get_table_structure(tableName) print(f"表 {tableName} 的结构信息:") for column in structure: print(column) db_info.disconnect()