使用 Knex.js 进行多行插入
Posted
技术标签:
【中文标题】使用 Knex.js 进行多行插入【英文标题】:Multi row insert using 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 标头和正文解析器,那么您的消息正文将被解释为一个对象。 【参考方案1】:req.body.<param_name>
始终是一个字符串。这很可能对你有用:
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");
);
【讨论】:
以上是关于使用 Knex.js 进行多行插入的主要内容,如果未能解决你的问题,请参考以下文章
使用 Oracle 程序 - Node.js Knex.js
Knex.js 和 MySQL:将整数转换为布尔值以进行批量选择
Knex.js 迁移问题:因`关系“knex_migrations”不存在而失败`