Files
promote/backend/scripts/check-clickhouse-schema.js
2025-03-11 00:36:22 +08:00

163 lines
4.2 KiB
JavaScript

// 检查ClickHouse数据库结构的脚本
const { ClickHouseClient } = require('@clickhouse/client');
const dotenv = require('dotenv');
const path = require('path');
// 加载环境变量
dotenv.config({ path: path.resolve(__dirname, '../.env') });
// 获取ClickHouse配置
const clickhouseHost = process.env.CLICKHOUSE_HOST || 'localhost';
const clickhousePort = process.env.CLICKHOUSE_PORT || '8123';
const clickhouseUser = process.env.CLICKHOUSE_USER || 'default';
const clickhousePassword = process.env.CLICKHOUSE_PASSWORD || '';
const clickhouseDatabase = process.env.CLICKHOUSE_DATABASE || 'default';
console.log('ClickHouse配置:');
console.log(` - 主机: ${clickhouseHost}`);
console.log(` - 端口: ${clickhousePort}`);
console.log(` - 用户: ${clickhouseUser}`);
console.log(` - 数据库: ${clickhouseDatabase}`);
// 创建ClickHouse客户端
const client = new ClickHouseClient({
host: `http://${clickhouseHost}:${clickhousePort}`,
username: clickhouseUser,
password: clickhousePassword,
database: clickhouseDatabase
});
// 获取所有表
async function getAllTables() {
console.log('\n获取所有表...');
try {
const query = `
SELECT name
FROM system.tables
WHERE database = '${clickhouseDatabase}'
`;
const resultSet = await client.query({
query,
format: 'JSONEachRow'
});
const tables = await resultSet.json();
if (!tables || tables.length === 0) {
console.log(`数据库 ${clickhouseDatabase} 中没有找到任何表`);
return null;
}
console.log(`数据库 ${clickhouseDatabase} 中找到以下表:`);
tables.forEach(table => {
console.log(` - ${table.name}`);
});
return tables.map(table => table.name);
} catch (error) {
console.error('获取所有表时出错:', error);
return null;
}
}
// 获取表结构
async function getTableSchema(tableName) {
console.log(`\n获取表 ${tableName} 的结构...`);
try {
const query = `
DESCRIBE TABLE ${clickhouseDatabase}.${tableName}
`;
const resultSet = await client.query({
query,
format: 'JSONEachRow'
});
const columns = await resultSet.json();
if (!columns || columns.length === 0) {
console.log(`${tableName} 不存在或没有列`);
return null;
}
console.log(`${tableName} 的列:`);
columns.forEach(column => {
console.log(` - ${column.name} (${column.type}, ${column.default_type === '' ? '无默认值' : `默认值: ${column.default_expression}`})`);
});
return columns;
} catch (error) {
console.error(`获取表 ${tableName} 结构时出错:`, error);
return null;
}
}
// 获取表数据示例
async function getTableDataSample(tableName, limit = 5) {
console.log(`\n获取表 ${tableName} 的数据示例 (最多 ${limit} 行)...`);
try {
const query = `
SELECT *
FROM ${clickhouseDatabase}.${tableName}
LIMIT ${limit}
`;
const resultSet = await client.query({
query,
format: 'JSONEachRow'
});
const rows = await resultSet.json();
if (!rows || rows.length === 0) {
console.log(`${tableName} 中没有数据`);
return null;
}
console.log(`${tableName} 的数据示例:`);
rows.forEach((row, index) => {
console.log(`${index + 1}:`);
Object.entries(row).forEach(([key, value]) => {
console.log(` ${key}: ${value}`);
});
});
return rows;
} catch (error) {
console.error(`获取表 ${tableName} 数据示例时出错:`, error);
return null;
}
}
// 主函数
async function main() {
try {
// 获取所有表
const tables = await getAllTables();
if (!tables) {
console.error('无法获取表列表');
process.exit(1);
}
// 获取每个表的结构和数据示例
for (const tableName of tables) {
await getTableSchema(tableName);
await getTableDataSample(tableName);
}
console.log('\nClickHouse数据库结构检查完成');
} catch (error) {
console.error('检查ClickHouse数据库结构时出错:', error);
} finally {
// 关闭客户端连接
await client.close();
}
}
// 运行主函数
main();