Files
nxxmdata/backend/fix-location-data.js
shenquanyi 2bd1d8c032 buider
2025-08-27 15:36:36 +08:00

115 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 修复数据库中的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 };