从JSON结构插入多行到MySQL

时间:2016-01-23 15:45:56

标签: javascript mysql json node.js

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

  

错误:ER_PARSE_ERROR:您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在''{{\“id \”:\“d3f3d \”,\“code \”:\“'第1行附近使用正确的语法

我使用url.json节点模块从request获取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);

});

数据记录为'' '[{\"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"
            }
        ]
    }
}

如何解决此问题?

感谢。

2 个答案:

答案 0 :(得分:3)

错误源于query对象尝试解析提供的值。该函数要求values数组包含多个数组,但接收的是字符串。 responseJson无需转换为JSON字符串。

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

"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');
});

issue解释了node-mysql的批量插入问题。

答案 1 :(得分:3)

您有潜在的安全问题。通过让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)

从你的行为看起来并不是什么大不了的事,但对你来说可能是一个巨大的交易。