You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.9 KiB
62 lines
1.9 KiB
const mysql = require('mysql2/promise');
|
|
|
|
// 数据库配置
|
|
const dbConfig = {
|
|
host: process.env.DB_HOST || '1.95.162.61',
|
|
user: process.env.DB_USER || 'root',
|
|
password: process.env.DB_PASSWORD || 'schl@2025',
|
|
database: process.env.DB_NAME || 'wechat_app',
|
|
waitForConnections: true,
|
|
connectionLimit: 10,
|
|
queueLimit: 0
|
|
};
|
|
|
|
// 创建数据库连接池
|
|
const pool = mysql.createPool(dbConfig);
|
|
|
|
// 清理过期数据的函数
|
|
async function cleanupExpiredData() {
|
|
try {
|
|
console.log('开始清理过期数据...');
|
|
|
|
// 连接到数据库
|
|
const connection = await pool.getConnection();
|
|
|
|
try {
|
|
// 1. 删除15天前的未完成记录(无签名)
|
|
const [result1] = await connection.execute(
|
|
'DELETE FROM certificate WHERE issueDate < DATE_SUB(NOW(), INTERVAL 15 DAY) AND signature IS NULL'
|
|
);
|
|
|
|
console.log(`清理了 ${result1.affectedRows} 条15天前的未完成记录`);
|
|
|
|
// 2. 对于每个sessionId,只保留最新的记录,删除更早的记录
|
|
// 注意:这个操作会删除每个sessionId的历史记录,只保留最新的一条
|
|
const cleanupHistorySql = `
|
|
DELETE c1 FROM certificate c1
|
|
JOIN (
|
|
SELECT sessionId, MAX(id) as max_id
|
|
FROM certificate
|
|
GROUP BY sessionId
|
|
HAVING COUNT(*) > 1
|
|
) c2 ON c1.sessionId = c2.sessionId AND c1.id < c2.max_id
|
|
`;
|
|
|
|
const [result2] = await connection.execute(cleanupHistorySql);
|
|
console.log(`清理了 ${result2.affectedRows} 条历史记录,每个sessionId只保留最新记录`);
|
|
|
|
console.log('数据清理完成!');
|
|
} finally {
|
|
// 释放连接
|
|
connection.release();
|
|
}
|
|
} catch (error) {
|
|
console.error('清理数据时出错:', error.message);
|
|
} finally {
|
|
// 关闭连接池
|
|
await pool.end();
|
|
}
|
|
}
|
|
|
|
// 执行清理操作
|
|
cleanupExpiredData();
|
|
|