115 lines
3.6 KiB
JavaScript
115 lines
3.6 KiB
JavaScript
/**
|
||
* 修复数据库中的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 }; |