python
import pymysql
import pandas as pd
# --- 请在此处填写您的StarRocks连接信息 ---
host = '172.31.0.1' # StarRocks FE 主机地址
port = 9030 # StarRocks FE 查询端口,默认为 9030
user = 'xxx' # StarRocks 用户名
password = 'xxx' # StarRocks 密码
# --- 连接信息填写完毕 ---
def export_starrocks_ddl_to_excel():
"""
连接到StarRocks集群,获取所有库和表的DDL,并将其导出到Excel文件。
"""
connection = None
try:
# 1. 连接到StarRocks
connection = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
charset='utf8mb4'
)
print("已成功连接到StarRocks。")
all_tables_ddl = []
with connection.cursor() as cursor:
# 2. 获取所有数据库
cursor.execute("SHOW DATABASES")
databases = [row[0] for row in cursor.fetchall()]
# 排除系统数据库
excluded_dbs = {'information_schema', '_statistics_','sr_dump_test','sys'}
databases_to_scan = [db for db in databases if db not in excluded_dbs]
print(f"将要扫描的数据库: {databases_to_scan}")
file = open('show_create_table.sql', 'w',encoding='utf-8')
# 3. 遍历数据库和表,获取DDL
for db_name in databases_to_scan:
cursor.execute(f"USE `{db_name}`")
cursor.execute("SHOW TABLES")
tables = [row[0] for row in cursor.fetchall()]
file.write(f"use {db_name};\n")
for table_name in tables:
try:
cursor.execute(f"SHOW CREATE TABLE `{db_name}`.`{table_name}`")
ddl_result = cursor.fetchone()
# 'SHOW CREATE TABLE' 的结果是 (Table, Create Table)
if ddl_result and len(ddl_result) > 1:
ddl_statement = ddl_result[1]
all_tables_ddl.append({
'库名': db_name,
'表名': table_name,
'ddl': ddl_statement
})
print(f"成功获取 `{db_name}`.`{table_name}` 的DDL。")
file.write(ddl_statement+'\n')
except Exception as e:
print(f"获取 `{db_name}`.`{table_name}` DDL失败: {e}")
file.close()
# 4. 将数据转换为DataFrame并导出到Excel
if all_tables_ddl:
df = pd.DataFrame(all_tables_ddl)
output_filename = 'show_create_table.csv'
df.to_csv(output_filename, index=False, encoding='utf-8')
print(f"\n所有DDL已成功导出到 '{output_filename}'。")
else:
print("未找到任何用户表,无法生成Excel文件。")
except pymysql.MySQLError as e:
print(f"数据库连接或操作失败: {e}")
except Exception as e:
print(f"发生未知错误: {e}")
finally:
if connection:
connection.close()
print("数据库连接已关闭。")
if __name__ == '__main__':
export_starrocks_ddl_to_excel()