【问题标题】:How to insert a json array data into mysql in node.js?如何在node.js中将json数组数据插入mysql?
【发布时间】: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)])

标签: javascript mysql node.js json


【解决方案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 的形式插入到数据库中, 因此插入数据非常容易,无需对数据进行字符串化或进行任何其他操作。我正在为您提供一种最简单的方法。让我们看看...

  1. 我有一个数据存储在变量 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 数据库中插入批量数据。您可以选择任何您想要的,但要注意插入查询。

  1. 代码是 ==>
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;
            }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-02-10
            • 2014-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-26
            • 1970-01-01
            • 2019-09-11
            相关资源
            最近更新 更多