135 lines
4.2 KiB
TypeScript
135 lines
4.2 KiB
TypeScript
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|||
|
|
// @ts-nocheck
|
|||
|
|
|
|||
|
|
// 加载环境变量(必须在其他导入之前)
|
|||
|
|
import * as dotenv from 'dotenv';
|
|||
|
|
import * as path from 'path';
|
|||
|
|
|
|||
|
|
// 根据 NODE_ENV 加载对应的环境配置文件
|
|||
|
|
const nodeEnv = process.env.NODE_ENV || 'development';
|
|||
|
|
const envFile = `.env.${nodeEnv}`;
|
|||
|
|
// scripts 目录的父目录就是 backend 目录
|
|||
|
|
const backendDir = path.resolve(__dirname, '..');
|
|||
|
|
const envPath = path.resolve(backendDir, envFile);
|
|||
|
|
|
|||
|
|
// 尝试加载环境特定的配置文件
|
|||
|
|
dotenv.config({ path: envPath });
|
|||
|
|
|
|||
|
|
// 如果环境特定文件不存在,尝试加载默认的 .env 文件
|
|||
|
|
if (!process.env.DATABASE_URL) {
|
|||
|
|
dotenv.config({ path: path.resolve(backendDir, '.env') });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 验证必要的环境变量
|
|||
|
|
if (!process.env.DATABASE_URL) {
|
|||
|
|
console.error('❌ 错误: 未找到 DATABASE_URL 环境变量');
|
|||
|
|
console.error(` 请确保存在以下文件之一:`);
|
|||
|
|
console.error(` - ${envPath}`);
|
|||
|
|
console.error(` - ${path.resolve(backendDir, '.env')}`);
|
|||
|
|
console.error(` 或者设置 NODE_ENV 环境变量(当前: ${nodeEnv})`);
|
|||
|
|
process.exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
import { PrismaClient } from '@prisma/client';
|
|||
|
|
|
|||
|
|
const prisma = new PrismaClient();
|
|||
|
|
|
|||
|
|
async function fixInvalidDatetime() {
|
|||
|
|
try {
|
|||
|
|
console.log('🔧 开始修复无效的日期时间数据...\n');
|
|||
|
|
|
|||
|
|
// 获取当前时间作为默认值
|
|||
|
|
const now = new Date();
|
|||
|
|
|
|||
|
|
// 修复 users 表中的无效日期
|
|||
|
|
console.log('📋 修复 users 表中的 modify_time...');
|
|||
|
|
const nowStr = now.toISOString().slice(0, 19).replace('T', ' ');
|
|||
|
|
const userResult = await prisma.$executeRawUnsafe(`
|
|||
|
|
UPDATE \`users\`
|
|||
|
|
SET modify_time = '${nowStr}'
|
|||
|
|
WHERE modify_time = '0000-00-00 00:00:00'
|
|||
|
|
OR modify_time < '1970-01-01 00:00:00'
|
|||
|
|
OR YEAR(modify_time) = 0
|
|||
|
|
OR MONTH(modify_time) = 0
|
|||
|
|
OR DAY(modify_time) = 0
|
|||
|
|
`);
|
|||
|
|
console.log(` ✅ 修复了 ${userResult} 条用户记录\n`);
|
|||
|
|
|
|||
|
|
// 修复其他所有包含 modify_time 的表
|
|||
|
|
const tables = [
|
|||
|
|
'tenants',
|
|||
|
|
'roles',
|
|||
|
|
'menus',
|
|||
|
|
'permissions',
|
|||
|
|
'dicts',
|
|||
|
|
'dict_items',
|
|||
|
|
'configs',
|
|||
|
|
'schools',
|
|||
|
|
'grades',
|
|||
|
|
'departments',
|
|||
|
|
'classes',
|
|||
|
|
'teachers',
|
|||
|
|
'students',
|
|||
|
|
'contests',
|
|||
|
|
'contest_teams',
|
|||
|
|
'contest_team_members',
|
|||
|
|
'contest_registrations',
|
|||
|
|
'contest_works',
|
|||
|
|
'contest_work_attachments',
|
|||
|
|
'contest_work_scores',
|
|||
|
|
'contest_work_judge_assignments',
|
|||
|
|
'contest_judges',
|
|||
|
|
'contest_notices',
|
|||
|
|
'contest_results',
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
let totalFixed = userResult;
|
|||
|
|
|
|||
|
|
for (const table of tables) {
|
|||
|
|
try {
|
|||
|
|
// 使用 Prisma 的原始 SQL,直接插入日期值
|
|||
|
|
const result = await prisma.$executeRawUnsafe(`
|
|||
|
|
UPDATE \`${table}\`
|
|||
|
|
SET modify_time = '${nowStr}'
|
|||
|
|
WHERE modify_time = '0000-00-00 00:00:00'
|
|||
|
|
OR modify_time < '1970-01-01 00:00:00'
|
|||
|
|
OR YEAR(modify_time) = 0
|
|||
|
|
OR MONTH(modify_time) = 0
|
|||
|
|
OR DAY(modify_time) = 0
|
|||
|
|
`);
|
|||
|
|
if (result > 0) {
|
|||
|
|
console.log(` ✅ ${table}: 修复了 ${result} 条记录`);
|
|||
|
|
totalFixed += result;
|
|||
|
|
}
|
|||
|
|
} catch (error: any) {
|
|||
|
|
// 如果表不存在或没有 modify_time 字段,跳过
|
|||
|
|
if (error.code !== 'P2025' && !error.message.includes('Unknown column')) {
|
|||
|
|
console.log(` ⚠️ ${table}: ${error.message}`);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log(`\n✅ 总共修复了 ${totalFixed} 条记录`);
|
|||
|
|
console.log('\n💡 建议:检查 MySQL 的 sql_mode 设置,确保禁止无效日期');
|
|||
|
|
console.log(' 可以在 my.cnf 或 my.ini 中添加:');
|
|||
|
|
console.log(' sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"');
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('\n💥 修复失败:', error);
|
|||
|
|
throw error;
|
|||
|
|
} finally {
|
|||
|
|
await prisma.$disconnect();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 执行修复
|
|||
|
|
fixInvalidDatetime()
|
|||
|
|
.then(() => {
|
|||
|
|
console.log('\n🎉 修复脚本执行完成!');
|
|||
|
|
process.exit(0);
|
|||
|
|
})
|
|||
|
|
.catch((error) => {
|
|||
|
|
console.error('\n💥 修复脚本执行失败:', error);
|
|||
|
|
process.exit(1);
|
|||
|
|
});
|
|||
|
|
|