【问题标题】:Multi row insert using Knex.js使用 Knex.js 进行多行插入
【发布时间】:2016-01-02 11:33:28
【问题描述】:

我正在尝试使用 Knex.js 构建多行插入查询

我的发布请求包含一个格式为以下格式的变量:[{addon_name:'sugar'},{addon_name:'milk'}]

我的数据库表只有一列,即addon_name

我的节点应用程序中的 knex 查询如下

knex(`<table_name>`).insert(req.body.`<param_name>`))

预期操作

insert into `<tablename>`(`addon_name`) values (sugar), (milk);

但代码不起作用。有没有cmets?

错误详情

{ [Error: insert into `table_name` (`0`, `1`, `10`, `11`, `12`, `13`, `14`, `15`, `16`, `17`, `18`, `19`, `2`, `20`, `21`, `22`, `23`, `24`, `25`, `26`, `27`, `28`, `29`, `3`, `30`, `31`, `32`, `33`, `34`, `35`, `36`, `37`, `38`, `39`, `4`, `40`, `41`, `5`, `6`, `7`, `8`, `9`) values ('[', '{', 'm', 'e', ':', '\'', 's', 'u', 'g', 'a', 'r', '\'', 'a', '}', ',', '{', 'a', 'd', 'd', 'o', 'n', '_', 'n', 'd', 'a', 'm', 'e', ':', '\'', 'm', 'i', 'l', 'k', '\'', 'd', '}', ']', 'o', 'n', '_', 'n', 'a') - ER_BAD_FIELD_ERROR: Unknown column '0' in 'field list']
  code: 'ER_BAD_FIELD_ERROR',
  errno: 1054,
  sqlState: '42S22',
  index: 0 }

【问题讨论】:

  • 怎么不工作?你有任何错误吗?
  • 已用错误详情更新帖子
  • 使用 content-type: application/json 标头和正文解析器,那么您的消息正文将被解释为一个对象。

标签: mysql node.js knex.js


【解决方案1】:

req.body.&lt;param_name&gt; 始终是一个字符串。这很可能对你有用:

knex(table_name).insert(JSON.parse(req.body.param_name)));

您在错误中看到的是 Knex 将字符串视为字符数组,试图将其推送到表格中。

在错误中,如下:

values ('[', '{', 'm', 'e', ':', '\'', 's', ...

实际上你的字符串被分解了吗:[{me:\'s...

【讨论】:

    【解决方案2】:

    谢谢。我将 post 方法中的输入结构更改为逗号分隔的字符串。这样就可以更轻松地解析输入并按照我需要的方式对其进行建模。

    post 方法输入:"milk,sugar"

    代码

    //Knex accepts multi row insert in the following format [{},{}] => we need to 
    //model our input that way
    var parsedValues = [];
    try {
        var arr = req.body.addons.split(',');
    }catch(err){
        return res.send({ "Message": "405" }); // Data not sent in proper format
    }
    
    for (var i in arr) {
        parsedValues.push({addon_name: arr[i]});
    }
    console.log(parsedValues);
    
    knex(`<table_name>`).insert(parsedValues).then(function (rows){ 
        console.log(rows);
        return res.send({ "Message": "777" }); // Operation Success
    }).catch(function (err){
        console.log(err)
        return res.send({ "Message": "403" }); // PK / FK Violation
    });
    

    【讨论】:

    • 如果有大插入,这在 Mysql 中不起作用。仅在 Postgres 中
    【解决方案3】:

    虽然这是一个老问题,但我在这里只是为其他偶然发现此问题的人回复。

    Knex 现在supports multi-row inserts 像这样:

    knex('coords').insert([{x: 20}, {y: 30},  {x: 10, y: 20}])
    

    输出:

    insert into `coords` (`x`, `y`) values (20, DEFAULT), (DEFAULT, 30), (10, 20)
    

    还有batchInsert utility 将插入一批包装在事务中的行。

    【讨论】:

      【解决方案4】:

      您可以使用batch insert

      DB.transaction(async (t: Knex.Transaction) => {
      return await t
        .batchInsert("addon_name", addon_nameRecords)
        .returning("id");
      });
      

      【讨论】:

        猜你喜欢
        • 2016-09-15
        • 1970-01-01
        • 2019-10-07
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 2015-03-06
        相关资源
        最近更新 更多