如何在node.js中将json数组数据插入mysql?

Posted

技术标签:

【中文标题】如何在node.js中将json数组数据插入mysql?【英文标题】:How to insert a json array data into mysql in node.js? 【发布时间】:2020-03-15 14:30:02 【问题描述】:

我的 json 是这样的:

var data = [ month: 1, customer: 11, revenue: 200,
             month: 2, customer: 13, revenue: 210
           ];

但是当我使用 sql 查询将其插入数据库时 "INSERT into t1 VALUES (data)", 我收到错误:"code":"ER_INVALID_JSON_TEXT","errno":3140,"sqlMessage":"Invalid JSON text: \"Invalid value.\" at position 1 in value for column t1.data

正确的查询语法应该是怎样的?任何答案将不胜感激

【问题讨论】:

应该是.query('INSERT into t1 VALUES (?)', [JSON.stringify(data)]) 【参考方案1】:

您收到错误的原因是它必须是有效的 json 文本

即键名必须在 '' 引号中,如果它们不是数字,则必须在值中 这是 json 字符串测试器来检查你的 json 的有效性json validator

然后将你的数据字符串化并保存

var data = JSON.parse(body);
var responseJson = JSON.stringify(data.response);

var query = connection.query('INSERT INTO table SET column=?', responseJson, 
 function(err, result) 
 if(err) throw err;
 console.log('data inserted');
 );

【讨论】:

嗨 JonoJames,通过使用该 json 验证器,我的数据是有效的。我唯一需要的是对我的数据进行字符串化。它奏效了【参考方案2】:

如果您想将数据以 Json Array 的形式插入到数据库中, 因此插入数据非常容易,无需对数据进行字符串化或进行任何其他操作。我正在为您提供一种最简单的方法。让我们看看...

    我有一个数据存储在变量 users 中。
let users = [
  
    "Email": "rachel@example.com",
    "EmployeeId": "9012",
    "Firstname": "Rachel",
    "Lastname": "Booker",
    "Department": "Sales",
    "Location": "Manchester"
  , 
    "Email": "laura@example.com",
    "EmployeeId": "2070",
    "Firstname": "Laura",
    "Lastname": "Grey",
    "Department": "Depot",
    "Location": "London"
  , 
    "Email": "craig@example.com",
    "EmployeeId": "4081",
    "Firstname": "Craig",
    "Lastname": "Johnson",
    "Department": "Depot",
    "Location": "London"
  ,
];

现在我要在 mysql 数据库中插入批量数据。您可以选择任何您想要的,但要注意插入查询。

    代码是 ==>
let sql = `insert ignore into employee values?`;

let values = [];

//an empty array and push the data in to values array using for loop.
//I have already created a table "Employee" with column name which is I am pushing //Data in same Manner.Note :- (Remember While Pushing data which will same Order as Your table column name)

//for loop is running till the length of the users;

for (let i = 0; i < users.length; i++) 
  values.push([users[i].Email, users[i].EmployeeId, users[i].Firstname, users[i].Lastname, users[i].Department, users[i].Location])


//Now Running the query (here con is a variable of database );

con.query(sql, [values], (err, result) => 
  if (err) throw err;
  console.log("rows affected " + result.affectedRows);
);

试试这个非常简单没有任何长代码没有任何错误。

【讨论】:

【参考方案3】:

为了给mysql添加一个数组,你需要形成正确的查询 插入多行的语法如下: 插入表名(column1,column2,column3)值 (1, 11, 200), // 第 1 行 (2, 13, 210) // 第 2 行

在您的情况下,您可以按如下方式创建请求:

const sqlQuery = `INSERT INTO t1 VALUES ` + data.map(month, customer, revenue => `($month, $customer, $revenue)`).join(',');

// if you use mysql client

var query = connection.query(sqlQuery, (err) => 
   if(err) throw err;
   console.log('data inserted');
);

【讨论】:

【参考方案4】:

您需要将数组包装在数组中以进行批量插入

var query = connection.query('INSERT INTO table SET column=?', [data], 
 function(err, result) 
 if(err) throw err;
 console.log('data inserted');
 );

【讨论】:

【参考方案5】:

感谢您帮助我。 我只需要对我的数据进行字符串化,然后它就可以工作了。

var json = JSON.stringify(data);

这个回报

 '[\"month\":11,\"year\":2019,\"customer\":10,\"revenue\":0,
   \"month\":12,\"year\":2019,\"customer\":0,\"revenue\":100]'

然后我通过"INSERT INTO table VALUES (json);"简单地插入了它

【讨论】:

【参考方案6】:

我会留下这个适用于我的案例的简单解决方案:

my-model.js

exports.insert = async dataObj => 
  try 
    const TABLE_NAME = 'my-table';

    // mysql table fields
    const ARR_TABLE_FIELDS = ['ds_prop', 'ds_otherprop', 'created_at'];
    
    // mysql table values which only needs the values
    const ARR_VALUES = Object.entries(dataObj).map(keyValue => 
      // keyValue arg is an array
      // which provides the value in the second position
      return `'$keyValue[1]'`
    );

    // mysql-handler will retrieve the data id
    const tableId = await mysqlHandler.insert(TABLE_NAME, ARR_TABLE_FIELDS, ARR_VALUES);

    return tableId;
   catch (err) 
    console.error(err.message);
  
;

mysql-handler.js 使用 NodeJS v12+ 和 npm 包 mysql2 version 2.2.5

  async insert(tableName, arrFields, arrValues) 

    const query = `INSERT INTO $tableName ($arrFields.toString()) VALUES ($arrValues.toString(), CURRENT_TIME())`;
    const response = await this.db.query(query);

    let id;

    if (response && Array.isArray(response) && response[0] && response[0].affectedRows > 0) 
      id = response[0].insertId;
    

    return id;
  

【讨论】:

以上是关于如何在node.js中将json数组数据插入mysql?的主要内容,如果未能解决你的问题,请参考以下文章

使用Node.js将数据数组插入数据库[重复]

如何使用 Sequelize 和 node.js 进行批量插入

如何在 JavaScript node.js 中将 xml 文件解析为数组

如何在node.js中将数组值作为可读流发出/管道?

如何使用 node.js 将多行 JSON 数据同时插入 MySQL?

如何在node.js中将mysql查询的结果输出为json文件