Files
nxxmdata/backend/fix-location-data.js

115 lines
3.6 KiB
JavaScript
Raw Normal View History

2025-08-27 15:36:36 +08:00
/**
* 修复数据库中的location字段格式
* 将JSON字符串转换为JSON对象
* @file fix-location-data.js
*/
const { Farm } = require('./models');
const { sequelize } = require('./config/database-simple');
async function fixLocationData() {
try {
console.log('连接数据库...');
await sequelize.authenticate();
console.log('\n查询所有养殖场记录...');
const farms = await Farm.findAll({
attributes: ['id', 'name', 'location']
});
console.log(`找到 ${farms.length} 条记录`);
let fixedCount = 0;
let errorCount = 0;
for (const farm of farms) {
try {
console.log(`\n处理 ID: ${farm.id}, 名称: ${farm.name}`);
console.log(`原始 location: ${JSON.stringify(farm.location)}`);
console.log(`location 类型: ${typeof farm.location}`);
let needsUpdate = false;
let newLocation = {};
// 检查location字段的格式
if (typeof farm.location === 'string') {
// 如果是字符串尝试解析为JSON
try {
newLocation = JSON.parse(farm.location);
needsUpdate = true;
console.log(` ✅ 解析JSON字符串成功: ${JSON.stringify(newLocation)}`);
} catch (parseError) {
console.log(` ❌ 解析JSON字符串失败: ${parseError.message}`);
errorCount++;
continue;
}
} else if (farm.location && typeof farm.location === 'object') {
// 如果已经是对象,检查是否需要格式化
newLocation = farm.location;
console.log(` ✅ 已经是对象格式`);
} else {
// 如果为空或其他类型,设置为空对象
newLocation = {};
needsUpdate = true;
console.log(` ⚠️ 设置为空对象`);
}
// 验证经纬度数据
if (newLocation.lng !== undefined) {
newLocation.lng = parseFloat(newLocation.lng);
}
if (newLocation.lat !== undefined) {
newLocation.lat = parseFloat(newLocation.lat);
}
// 更新数据库记录
if (needsUpdate) {
await farm.update({ location: newLocation });
console.log(` ✅ 更新成功: ${JSON.stringify(newLocation)}`);
fixedCount++;
} else {
console.log(` ⏭️ 无需更新`);
}
} catch (error) {
console.error(` ❌ 处理记录 ${farm.id} 时出错:`, error.message);
errorCount++;
}
}
console.log('\n' + '='.repeat(60));
console.log(`修复完成!`);
console.log(`总记录数: ${farms.length}`);
console.log(`修复成功: ${fixedCount}`);
console.log(`修复失败: ${errorCount}`);
console.log(`无需修复: ${farms.length - fixedCount - errorCount}`);
// 验证修复结果
console.log('\n验证修复结果...');
const verifyFarms = await Farm.findAll({
attributes: ['id', 'name', 'location'],
limit: 5
});
verifyFarms.forEach(farm => {
console.log(`ID: ${farm.id}, Location类型: ${typeof farm.location}, 值: ${JSON.stringify(farm.location)}`);
});
} catch (error) {
console.error('修复失败:', error.message);
if (error.sql) {
console.error('SQL:', error.sql);
}
} finally {
await sequelize.close();
console.log('\n数据库连接已关闭');
}
}
// 运行修复
if (require.main === module) {
console.log('开始修复数据库中的location字段格式...');
fixLocationData();
}
module.exports = { fixLocationData };