繁体   English   中英

MySQL SET仅将列表中的第一项插入

[英]MySQL SET inserts only the first item in a list

我正在使用NodeJs msyql,

var telemetryItemList = [
    { 'created_at': createdAt, 'device_type': deviceType + '1', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
    { 'created_at': createdAt, 'device_type': deviceType + '2', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
    { 'created_at': createdAt, 'device_type': deviceType + '3', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
    { 'created_at': createdAt, 'device_type': deviceType + '4', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
    { 'created_at': createdAt, 'device_type': deviceType + '5', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue }
];

pool.getConnection((err, conn) => {
    if(err) {
        throw new Error('Could not get DB connection');
    }
    conn.query(`INSERT INTO ${Config.tableName} SET ?`, telemetryItemList, (err, res) => {
    .
    .
    .

上面的代码仅插入列表的第一行,为什么呢?

UPDATE

遵循我在这里收到的良好答案之后,我相信最好将整个对象刷新到数据库中,而不要在每一行上创建查询

就像是:

var telemetryItemList2 = [
    ['created_at': createdAt, 'device_type': deviceType + '1', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue],
    ['created_at': createdAt, 'device_type': deviceType + '2', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue],
    ['created_at': createdAt, 'device_type': deviceType + '3', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue],
    ['created_at': createdAt, 'device_type': deviceType + '4', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue],
    ['created_at': createdAt, 'device_type': deviceType + '5', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue],
];

但是如何构造模型?

var telemetryItemList = [
    { 'created_at': createdAt, 'device_type': deviceType + '1', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
    { 'created_at': createdAt, 'device_type': deviceType + '2', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
    { 'created_at': createdAt, 'device_type': deviceType + '3', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
    { 'created_at': createdAt, 'device_type': deviceType + '4', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
    { 'created_at': createdAt, 'device_type': deviceType + '5', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue }
];

pool.getConnection((err, conn) => {
    if(err) {
        throw new Error('Could not get DB connection');
    }
    conn.query(`INSERT INTO ${Config.tableName} SET ?`, [telemetryItemList], (err, res) => {
    .
    .
    .
var telemetryItemList = [
  { 'created_at': createdAt, 'device_type': deviceType + '1', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
  { 'created_at': createdAt, 'device_type': deviceType + '2', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
  { 'created_at': createdAt, 'device_type': deviceType + '3', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
  { 'created_at': createdAt, 'device_type': deviceType + '4', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue },
  { 'created_at': createdAt, 'device_type': deviceType + '5', 'device_serial': deviceSerial , 'metric_name': metricName, 'metric_value': metricValue }
];

尝试遍历telemetryItemList

pool.getConnection((err, conn) => {
  if(err) {
      throw new Error('Could not get DB connection');
  }
  telemetryItemList.forEach(row => {
    conn.query(`INSERT INTO ${Config.tableName} SET ?`, row, (err, res) => {
      //
    });
  });
});

您需要使用INSERT ... VALUES ,( INSERT ... SET不支持批量),还需要将telemetryItemList设置为array:

pool.getConnection((err, conn) => {
    if(err) {
        throw new Error('Could not get DB connection');
    }
    conn.query(`INSERT INTO ${Config.tableName} (created_at, device_type, device_serial, metric_name, metric_value) VALUES ?`, [telemetryItemList.map(tel_arr => [tel_arr.created_at, tel_arr.device_type, tel_arr.device_serial, tel_arr.metric_name, tel_arr.metric_value])], (err, res) => {
    .
    .
    .

参考:
批量插入对象数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM