从JSON结构插入多行到MySQL

我坚持使用NodeJS插入JSON数据到MySQL数据库。 我得到这个错误:

错误:ER_PARSE_ERROR:您的SQL语法中有错误; 检查与您的MySQL服务器版本相对应的手册,以便在第1行'[{\“id \”:\“d3f3d \”,\“code \”:\“'

我从使用request Node模块的url.json获取JSON数据,并试图将数据存储在MySQL数据库。

 //mysql connection setup var connection = mysql.createConnection({ host : "localhost", port: "3306", user : "root", password : "root", database : "db", multipleStatements: true }); request('url.json', function (error, response, body) { if (!error && response.statusCode == 200) { //console.log(body) } var sql = "INSERT INTO table (id, code, country_name, city) VALUES ?"; var data = JSON.parse(body); var responseJson = JSON.stringify(data.response.docs); var query = connection.query(sql, [responseJson], function(err, result) { if(err) throw err; console.log('data inserted'); }); console.log(query.sql); }); 

数据logging为'' '[{\"id\":\"d3f3d\",\"code\":\"'... }]' ,我认为这可能是错误的根源。

JSON结构如下所示:

 { "header": { "file1":0, "file2":1, "subfiles":{ "subfile1":"true", "subfile2":"true", } }, "response": { "number":678, "start":0, "docs":[ { "id":"d3f3d", "code":"l876s", "country_name":"United States", "city":"LA" }, { "id":"d2f2d", "code":"2343g", "country_name":"UK", "city":"London" } ] } } 

我如何解决这个问题?

谢谢。

该错误源于query对象尝试parsing提供的值。 该函数期望值数组包含多个数组,但收到一个string。 responseJson不需要转换成JSONstring。

您需要将对象数组转换为仅包含值的数组数组。 例如,查询需要这种forms的数组:

 "docs":[ [ "d3f3d", "l876s", "United States", "LA" ], [ "d2f2d", "2343g", "UK", "London" ] ] 

这是一个将对象数组转换为值数组的方法:

 function ObjToArray(obj) { var arr = obj instanceof Array; return (arr ? obj : Object.keys(obj)).map(function(i) { var val = arr ? i : obj[i]; if(typeof val === 'object') return ObjToArray(val); else return val; }); } 

这是重构的代码:

 var data = JSON.parse(body); // Convert the array of objects into an array of arrays. var responseJson = ObjToArray(data.response.docs); // The query object expects an array of objects so you pass in 'responseJson' as is var query = connection.query(sql, responseJson, function(err, result) { if(err) throw err; console.log('data inserted'); }); 

这个问题解释了node-mysql批量插入问题。

您有一个潜在的安全问题。 一个切肉刀的人可以通过让data.response.docs包含MySQL命令来从表中窃取数据。 更换

 var sql = "INSERT INTO table (id, code, country_name, city) VALUES ?"; 

 var sql = "INSERT INTO table (id, code, country_name, city) VALUES (? ? ? ?)"; 

然后更换

 var query = connection.query(sql, [responseJson], function(err, result) 

 var query = connection.query(sql, [var1, var2, var3, var4], function(err, result) 

从它看起来像你在做什么不是一个大问题,但可能是一个巨大的交易后来为你。