74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import prisma from '../src/utils/prisma';
|
||
import { generateUniqueDigitalId } from '../src/utils/digitalIdGenerator';
|
||
|
||
/**
|
||
* 为现有用户生成 digitalId
|
||
* 此脚本用于数据库迁移,为所有没有 digitalId 的用户生成唯一的 ID
|
||
*/
|
||
async function migrateDigitalIds() {
|
||
try {
|
||
console.log('🚀 开始迁移 digitalId...');
|
||
|
||
// 查找所有没有 digitalId 的用户
|
||
const users = await prisma.user.findMany({
|
||
where: { digitalId: null },
|
||
});
|
||
|
||
console.log(`📊 找到 ${users.length} 个需要生成 digitalId 的用户`);
|
||
|
||
if (users.length === 0) {
|
||
console.log('✅ 所有用户都已拥有 digitalId,无需迁移');
|
||
return;
|
||
}
|
||
|
||
let successCount = 0;
|
||
let failCount = 0;
|
||
|
||
for (const user of users) {
|
||
try {
|
||
// 生成唯一的 digitalId
|
||
const digitalId = await generateUniqueDigitalId();
|
||
|
||
// 更新用户
|
||
await prisma.user.update({
|
||
where: { id: user.id },
|
||
data: { digitalId },
|
||
});
|
||
|
||
console.log(`✅ 为用户 ${user.id} (${user.nickname || '未设置昵称'}) 生成 digitalId: ${digitalId}`);
|
||
successCount++;
|
||
} catch (error: any) {
|
||
console.error(`❌ 为用户 ${user.id} 生成 digitalId 失败: ${error.message}`);
|
||
failCount++;
|
||
}
|
||
}
|
||
|
||
console.log('\n📊 迁移完成统计:');
|
||
console.log(` ✅ 成功: ${successCount} 个用户`);
|
||
console.log(` ❌ 失败: ${failCount} 个用户`);
|
||
console.log(` 📝 总计: ${users.length} 个用户`);
|
||
|
||
if (failCount > 0) {
|
||
console.log('\n⚠️ 有部分用户迁移失败,请检查日志并手动处理');
|
||
} else {
|
||
console.log('\n🎉 所有用户迁移成功!');
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 迁移过程中发生错误:', error);
|
||
throw error;
|
||
} finally {
|
||
await prisma.$disconnect();
|
||
}
|
||
}
|
||
|
||
// 执行迁移
|
||
migrateDigitalIds()
|
||
.then(() => {
|
||
console.log('✅ 迁移脚本执行完成');
|
||
process.exit(0);
|
||
})
|
||
.catch((error) => {
|
||
console.error('❌ 迁移脚本执行失败:', error);
|
||
process.exit(1);
|
||
});
|