2016-01-23 85 views
1

我一直在使用NodeJS將JSON數據插入MySQL數據庫。 我得到這個錯誤:從JSON結構插入多行到MySQL

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''[{\"id\":\"d3f3d\",\"code\":\"' at line 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

該錯誤源於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

我同意。我幾分鐘前添加了一個答案,但沒有意識到docs對象已經是一個數組了,所以我將其刪除了。無論如何,stringify是問題。 +1。 –

+0

我做了這些更改,並且再次出現錯誤:ER_PARSE_ERROR:您的SQL語法中有錯誤;檢查對應於你的MySQL服務器版本的手冊,在''id' ='d3f3d','code' ='l876s',''在第1行'附近使用正確的語法' – corry

+0

我已經更新了答案。 – gnerkus

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) 

沒什麼大不了的,從它看起來像你這樣做,但可能是一個巨大的稍後爲您處理。