191 lines
6.1 KiB
TypeScript
191 lines
6.1 KiB
TypeScript
/**
|
|
* 查询模板系统
|
|
* 提供 10 个预设模板,适配 MySQL、PostgreSQL、Redis、MongoDB 四种数据库类型
|
|
*/
|
|
|
|
export type DBType = 'mysql' | 'postgresql' | 'redis' | 'mongodb';
|
|
|
|
export type QueryTemplate = {
|
|
id: string;
|
|
name: string;
|
|
description: string;
|
|
category: string;
|
|
sql: Partial<Record<DBType, string>>;
|
|
supportedTypes: DBType[];
|
|
};
|
|
|
|
export const queryTemplates: QueryTemplate[] = [
|
|
{
|
|
id: 'table-structure',
|
|
name: '查询表结构',
|
|
description: '查看指定表或集合的结构定义,包括字段、类型、索引等信息',
|
|
category: '表结构',
|
|
sql: {
|
|
mysql: 'SHOW CREATE TABLE {table};',
|
|
postgresql:
|
|
"SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name = '{table}' ORDER BY ordinal_position;",
|
|
mongodb: 'db.{collection}.getIndexes()',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql', 'mongodb'],
|
|
},
|
|
{
|
|
id: 'table-size',
|
|
name: '查询表大小',
|
|
description: '查看数据库中各表或集合的存储空间占用情况',
|
|
category: '数据统计',
|
|
sql: {
|
|
mysql: "SELECT table_name, data_length, index_length FROM information_schema.tables WHERE table_schema = '{db}';",
|
|
postgresql:
|
|
"SELECT relname, pg_relation_size(oid) FROM pg_class WHERE relkind='r';",
|
|
redis: 'INFO memory',
|
|
mongodb: 'db.stats()',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql', 'redis', 'mongodb'],
|
|
},
|
|
{
|
|
id: 'active-connections',
|
|
name: '查询活跃连接',
|
|
description: '查看当前数据库的活跃连接数及连接详情',
|
|
category: '性能分析',
|
|
sql: {
|
|
mysql: 'SHOW PROCESSLIST;',
|
|
postgresql: 'SELECT * FROM pg_stat_activity;',
|
|
redis: 'CLIENT LIST',
|
|
mongodb: 'db.currentOp()',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql', 'redis', 'mongodb'],
|
|
},
|
|
{
|
|
id: 'indexes',
|
|
name: '查询索引',
|
|
description: '查看指定表或集合的索引信息',
|
|
category: '表结构',
|
|
sql: {
|
|
mysql: 'SHOW INDEX FROM {table};',
|
|
postgresql:
|
|
"SELECT * FROM pg_indexes WHERE tablename = '{table}';",
|
|
mongodb: 'db.{collection}.getIndexes()',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql', 'mongodb'],
|
|
},
|
|
{
|
|
id: 'lock-waits',
|
|
name: '查询锁等待',
|
|
description: '查看当前数据库中存在的锁等待情况,排查锁冲突',
|
|
category: '性能分析',
|
|
sql: {
|
|
mysql: 'SELECT * FROM information_schema.innodb_lock_waits;',
|
|
postgresql: 'SELECT * FROM pg_locks WHERE NOT granted;',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql'],
|
|
},
|
|
{
|
|
id: 'top-n',
|
|
name: 'TOP N查询',
|
|
description: '查询指定表中按ID倒序排列的前N条记录',
|
|
category: '基础查询',
|
|
sql: {
|
|
mysql: 'SELECT * FROM {table} ORDER BY id DESC LIMIT {n};',
|
|
postgresql: 'SELECT * FROM {table} ORDER BY id DESC LIMIT {n};',
|
|
mongodb: 'db.{collection}.find().sort({_id:-1}).limit({n})',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql', 'mongodb'],
|
|
},
|
|
{
|
|
id: 'fuzzy-search',
|
|
name: '模糊搜索',
|
|
description: '根据关键词对指定字段进行模糊匹配查询',
|
|
category: '基础查询',
|
|
sql: {
|
|
mysql: "SELECT * FROM {table} WHERE {column} LIKE '%{keyword}%';",
|
|
postgresql: "SELECT * FROM {table} WHERE {column} LIKE '%{keyword}%';",
|
|
redis: 'KEYS *{keyword}*',
|
|
mongodb: 'db.{collection}.find({field: /{keyword}/})',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql', 'redis', 'mongodb'],
|
|
},
|
|
{
|
|
id: 'statistics',
|
|
name: '查询统计信息',
|
|
description: '查看表或集合的统计信息,包括行数、大小、索引等',
|
|
category: '数据统计',
|
|
sql: {
|
|
mysql: "SHOW TABLE STATUS LIKE '{table}';",
|
|
postgresql:
|
|
"SELECT * FROM pg_stat_user_tables WHERE relname='{table}';",
|
|
redis: 'INFO keyspace',
|
|
mongodb: 'db.{collection}.stats()',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql', 'redis', 'mongodb'],
|
|
},
|
|
{
|
|
id: 'execution-plan',
|
|
name: '查询执行计划',
|
|
description: '查看查询语句的执行计划,用于SQL性能优化分析',
|
|
category: '性能分析',
|
|
sql: {
|
|
mysql: 'EXPLAIN SELECT ...',
|
|
postgresql: 'EXPLAIN SELECT ...',
|
|
mongodb: 'db.{collection}.find({...}).explain()',
|
|
},
|
|
supportedTypes: ['mysql', 'postgresql', 'mongodb'],
|
|
},
|
|
{
|
|
id: 'redis-get',
|
|
name: 'GET 查询',
|
|
description: '获取 Redis String 类型 key 的值',
|
|
category: '基础查询',
|
|
sql: { redis: 'GET {key}' },
|
|
supportedTypes: ['redis'],
|
|
},
|
|
{
|
|
id: 'redis-hgetall',
|
|
name: 'HGETALL 查询',
|
|
description: '获取 Redis Hash 类型 key 的所有字段和值',
|
|
category: '基础查询',
|
|
sql: { redis: 'HGETALL {key}' },
|
|
supportedTypes: ['redis'],
|
|
},
|
|
{
|
|
id: 'redis-hget',
|
|
name: 'HGET 查询',
|
|
description: '获取 Redis Hash 类型 key 中指定字段的值',
|
|
category: '基础查询',
|
|
sql: { redis: 'HGET {key} {field}' },
|
|
supportedTypes: ['redis'],
|
|
},
|
|
];
|
|
|
|
/**
|
|
* 获取模板在指定数据库类型下的查询语句
|
|
* 自动替换占位符: {table} → 当前选中的表, {db} → 当前数据库, {collection} → 集合名
|
|
*/
|
|
export function getTemplateSQL(
|
|
template: QueryTemplate,
|
|
dbType: DBType,
|
|
vars?: { table?: string; db?: string; collection?: string }
|
|
): string {
|
|
const sql = template.sql[dbType];
|
|
if (!sql) {
|
|
return `-- 当前模板「${template.name}」不支持 ${dbType} 数据库类型`;
|
|
}
|
|
let result = sql;
|
|
const v = vars || {};
|
|
if (v.table) result = result.replace(/\{table\}/g, v.table);
|
|
if (v.db) result = result.replace(/\{db\}/g, v.db);
|
|
if (v.collection) result = result.replace(/\{collection\}/g, v.collection);
|
|
// 未替换的占位符保留,用户手动填写
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* 获取指定数据库类型支持的所有模板
|
|
* @param dbType 数据库类型
|
|
* @returns 该数据库类型支持的模板列表
|
|
*/
|
|
export function getTemplatesForType(dbType: DBType): QueryTemplate[] {
|
|
return queryTemplates.filter((template) =>
|
|
template.supportedTypes.includes(dbType)
|
|
);
|
|
}
|