|
@@ -21,6 +21,7 @@ app.get("/tables", async (req, res) => {
|
|
let pool;
|
|
let pool;
|
|
try {
|
|
try {
|
|
const { IP, host, baseName, username, password } = req.query;
|
|
const { IP, host, baseName, username, password } = req.query;
|
|
|
|
+
|
|
// 数据库连接配置
|
|
// 数据库连接配置
|
|
pool = mysql.createPool({
|
|
pool = mysql.createPool({
|
|
host: IP,
|
|
host: IP,
|
|
@@ -29,19 +30,27 @@ app.get("/tables", async (req, res) => {
|
|
database: baseName,
|
|
database: baseName,
|
|
port: host,
|
|
port: host,
|
|
});
|
|
});
|
|
|
|
+
|
|
const connection = await pool.getConnection();
|
|
const connection = await pool.getConnection();
|
|
|
|
+
|
|
|
|
+ // 获取所有表名
|
|
const [tables] = await connection.query("SHOW TABLES");
|
|
const [tables] = await connection.query("SHOW TABLES");
|
|
|
|
+
|
|
const tableFieldMap = {};
|
|
const tableFieldMap = {};
|
|
|
|
+
|
|
for (const table of tables) {
|
|
for (const table of tables) {
|
|
- const tableName = Object.values(table)[0];
|
|
|
|
- const [fields] = await connection.query(`DESCRIBE ${tableName}`);
|
|
|
|
|
|
+ const tableName = `${Object.values(table)[0]}`;
|
|
|
|
+
|
|
|
|
+ // 加反引号以支持包含特殊字符的表名
|
|
|
|
+ const [fields] = await connection.query("DESCRIBE `" + tableName + "`");
|
|
|
|
+
|
|
tableFieldMap[tableName] = fields.map((field) => field.Field);
|
|
tableFieldMap[tableName] = fields.map((field) => field.Field);
|
|
}
|
|
}
|
|
|
|
+
|
|
connection.release();
|
|
connection.release();
|
|
res.json(tableFieldMap);
|
|
res.json(tableFieldMap);
|
|
} catch (error) {
|
|
} catch (error) {
|
|
- // console.error("Error fetching database structure:", error);
|
|
|
|
- res.status(500).send("请检查填写的数据库数据是否有误" + error);
|
|
|
|
|
|
+ res.status(500).send("请检查填写的数据库数据是否有误: " + error.message);
|
|
} finally {
|
|
} finally {
|
|
// 确保关闭数据库连接池
|
|
// 确保关闭数据库连接池
|
|
if (pool) {
|
|
if (pool) {
|
|
@@ -49,67 +58,80 @@ app.get("/tables", async (req, res) => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
+
|
|
app.post("/filterTablesData", async (req, res) => {
|
|
app.post("/filterTablesData", async (req, res) => {
|
|
|
|
+ let pool;
|
|
try {
|
|
try {
|
|
- console.log(req.params, req.body, "req.query.filterData");
|
|
|
|
const { IP, host, baseName, username, password } = req.body.database;
|
|
const { IP, host, baseName, username, password } = req.body.database;
|
|
const filterData = req.body.filterData;
|
|
const filterData = req.body.filterData;
|
|
|
|
+
|
|
// 数据库连接配置
|
|
// 数据库连接配置
|
|
- const pool = mysql.createPool({
|
|
|
|
|
|
+ pool = mysql.createPool({
|
|
host: IP,
|
|
host: IP,
|
|
user: username,
|
|
user: username,
|
|
password: password,
|
|
password: password,
|
|
database: baseName,
|
|
database: baseName,
|
|
port: host,
|
|
port: host,
|
|
});
|
|
});
|
|
- // 获取数据库连接;
|
|
|
|
|
|
+
|
|
const connection = await pool.getConnection();
|
|
const connection = await pool.getConnection();
|
|
- // 用于存储最终查询结果
|
|
|
|
const resultData = {};
|
|
const resultData = {};
|
|
- // 遍历 filterData
|
|
|
|
|
|
+
|
|
for (const item of filterData) {
|
|
for (const item of filterData) {
|
|
const parentNode = item.parentNode; // 数据表名
|
|
const parentNode = item.parentNode; // 数据表名
|
|
|
|
+ if (!parentNode) {
|
|
|
|
+ console.warn(
|
|
|
|
+ "parentNode is undefined or null. Skipping this item:",
|
|
|
|
+ item
|
|
|
|
+ );
|
|
|
|
+ continue; // 跳过无效的项
|
|
|
|
+ }
|
|
const checkChildNode = item.checkChildNode; // 要查询的字段
|
|
const checkChildNode = item.checkChildNode; // 要查询的字段
|
|
|
|
|
|
// 检查表是否存在
|
|
// 检查表是否存在
|
|
const [tables] = await connection.query("SHOW TABLES");
|
|
const [tables] = await connection.query("SHOW TABLES");
|
|
- const tableNames = tables.map((row) => Object.values(row)[0]);
|
|
|
|
- if (!tableNames.includes(parentNode)) {
|
|
|
|
- continue; // 如果表不存在,跳过
|
|
|
|
|
|
+ const tableNames = tables.map((row) =>
|
|
|
|
+ Object.values(row)[0].toLowerCase()
|
|
|
|
+ );
|
|
|
|
+ if (!tableNames.includes(parentNode.toLowerCase())) {
|
|
|
|
+ continue;
|
|
}
|
|
}
|
|
|
|
|
|
// 获取表字段信息
|
|
// 获取表字段信息
|
|
const [columns] = await connection.query(
|
|
const [columns] = await connection.query(
|
|
- `SHOW COLUMNS FROM ${parentNode}`
|
|
|
|
|
|
+ `SHOW COLUMNS FROM \`${parentNode}\``
|
|
);
|
|
);
|
|
const tableFields = columns.map((column) => column.Field);
|
|
const tableFields = columns.map((column) => column.Field);
|
|
|
|
|
|
- // 过滤存在的字段
|
|
|
|
|
|
+ // 过滤有效字段
|
|
const validFields = checkChildNode.filter((field) =>
|
|
const validFields = checkChildNode.filter((field) =>
|
|
tableFields.includes(field)
|
|
tableFields.includes(field)
|
|
);
|
|
);
|
|
if (validFields.length === 0) {
|
|
if (validFields.length === 0) {
|
|
- continue; // 如果没有匹配的字段,跳过
|
|
|
|
|
|
+ continue;
|
|
}
|
|
}
|
|
|
|
|
|
// 动态查询字段的数据
|
|
// 动态查询字段的数据
|
|
- const sqlQuery = `SELECT ${validFields.join(
|
|
|
|
- ", "
|
|
|
|
- )} FROM ${parentNode} LIMIT 100`; // 限制查询 100 条数据
|
|
|
|
|
|
+ const sqlQuery = `SELECT ${validFields
|
|
|
|
+ .map((field) => `\`${field}\``)
|
|
|
|
+ .join(", ")} FROM \`${parentNode}\` LIMIT 500`;
|
|
|
|
+ console.log("Generated SQL Query:", sqlQuery);
|
|
const [rows] = await connection.query(sqlQuery);
|
|
const [rows] = await connection.query(sqlQuery);
|
|
-
|
|
|
|
// 保存结果
|
|
// 保存结果
|
|
resultData[parentNode] = rows;
|
|
resultData[parentNode] = rows;
|
|
}
|
|
}
|
|
- // 释放连接
|
|
|
|
connection.release();
|
|
connection.release();
|
|
- // 返回最终数据
|
|
|
|
res.json(resultData);
|
|
res.json(resultData);
|
|
} catch (error) {
|
|
} catch (error) {
|
|
console.error(error);
|
|
console.error(error);
|
|
- res.status(500).send("Error fetching data from database");
|
|
|
|
|
|
+ res.status(500).send(`数据库报错: ${error.message}`);
|
|
|
|
+ } finally {
|
|
|
|
+ if (pool) {
|
|
|
|
+ await pool.end();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
+
|
|
app.listen(PORT, () => {
|
|
app.listen(PORT, () => {
|
|
console.log(`Server is running on http://localhost:${PORT}`);
|
|
console.log(`Server is running on http://localhost:${PORT}`);
|
|
});
|
|
});
|