使用Knex.js进行多行插入

时间:2015-10-05 17:57:54

标签: mysql node.js knex.js

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

我的帖子请求包含一个变量,其格式如下:[{addon_name:'sugar'},{addon_name:'milk'}]

我的数据库表只有一列addon_name

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

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

预期op

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

但代码dosn工作。有什么意见吗?

错误详细信息

{ [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 }

4 个答案:

答案 0 :(得分:1)

req.body.<param_name>始终是一个字符串。最有可能这对你有用:

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

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

在错误中,以下内容:

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

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

答案 1 :(得分:1)

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

发布方法输入:&#34;牛奶,糖&#34;

//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
});

答案 2 :(得分:1)

尽管这是一个古老的问题,但我在此仅针对那些偶然发现此问题的人。

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

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将插入包裹在事务中的一批行。

答案 3 :(得分:0)

您可以使用batch insert

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