将API数据存入MySQL时出现‘未知列’错误,求解决(附代码)
问题排查与解决
核心错误原因
你的SQL插入语句中,字段列表的反引号使用错误:
INSERT INTO countries (`cca2,ccn3,cca3,region,latlng`) values ?
这里把所有字段名包裹在单个反引号内,MySQL会将cca2,ccn3,cca3,region,latlng识别为一个单独的字段名,而非多个字段的集合,自然会提示找不到该列。
额外注意点
接口返回的latlng是数组类型(例如[34, -40]),MySQL无法直接存储数组,需要先转换为字符串格式(推荐JSON字符串,方便后续解析)。
修正后的代码
(async () => { let arr = []; try { const response = await fetch('https://restcountries.com/v3.1/all'); const json = await response.json(); json.forEach((element) => { let obj = { cca2: element.cca2, ccn3: element.ccn3, cca3: element.cca3, region: element.region, // 将latlng数组转为JSON字符串 latlng: JSON.stringify(element.latlng), }; arr.push(obj); }); // 修正SQL字段列表的反引号使用 const sql = 'INSERT INTO countries (cca2, ccn3, cca3, region, latlng) VALUES ?'; // 用promise封装query,方便异步错误处理 await new Promise((resolve, reject) => { db.query(sql, [ arr.map((item) => [ item.cca2, item.ccn3, item.cca3, item.region, item.latlng, ]), ], (err, result) => { if (err) reject(err); else resolve(result); }); }); console.log('数据插入成功'); } catch (error) { console.error('处理过程出错:', error); } })();
补充说明
- 如果你的
countries表中字段名是MySQL关键字(这里显然不是),可以给每个字段单独加反引号:INSERT INTO countries (`cca2`, `ccn3`, `cca3`, `region`, `latlng`) VALUES ? - 若后续需要读取
latlng并恢复为数组,只需用JSON.parse()解析即可。 - 加入了
db.query的异步错误处理,避免遗漏插入失败的情况。
内容的提问来源于stack exchange,提问作者The Tech Guy
相关产品推荐
相关产品推荐

