node.js - 如何使用 kenxjs 在 psql 中批量插入?
问题描述
我搜索了很多,这是不推荐使用的问题。
我正在尝试在表中批量插入。
我的方法是这样的
knex('test_table').where({
user: 'user@example.com',
})
.then(result => {
knex.transaction(trx => {
Bluebird.map(result, data => {
return trx('main_table')
.insert(data.insert_row)
}, { concurrency: 3 })
.then(trx.commit);
})
.then(() => {
console.log("done bulk insert")
})
.catch(err => console.error('bulk insert error: ', err))
})
如果文本或数字列的列可以工作,但我有jsonb列
所以我得到了这个错误
json 类型的输入语法无效
那么我该如何解决这个问题呢?
解决方案
听起来有些 json 列在发送到 DB 时没有字符串化数据。
这也是插入多行最慢的方法,因为您正在为每个插入的行执行 1 次查询并使用单个连接进行插入。
该并发 3 仅导致 pg 驱动程序在通过与所有其他查询相同的事务将它们发送到数据库之前缓冲这两个查询。
像这样的东西应该非常有效(没有测试运行代码,所以可能会有错误):
const rows = await knex('test_table').where({ user: 'user@example.com' });
rows.forEach(row => {
// make sure that json columns are actually json strings
row.someColumnWithJson = JSON.stringify(row.someColumnWithJson);
});
await knex.transaction(async trx => {
let i, j, temparray, chunk = 200;
// insert rows in 200 row batches
for (i = 0, j = rows.length; i < j; i += chunk) {
rowsToInsert = rows.slice(i, i + chunk);
await trx('main_table').insert(rowsToInsert);
}
});
也knex.batchInsert
可能对你有用。
推荐阅读
- java - 为了线程安全,非最终字段是否也需要在构造函数中同步?
- mysql - 如果用户在 mysql 中完成了所有课程,则计算用户数
- python - 如何将地图与定义的功能一起使用
- c# - 为什么 asp.net 用户会话结束会导致不同应用程序池中的 Quartz 任务终止?
- python-3.x - 国际化 Python 项目,使用 PyGTK3 和 Glade
- c - 未使用 gcc 和 makefile 为 #ifdef 定义值
- sql - MS Access - 子查询在 Access 中不起作用(sql 有效)
- google-apps-script - 服务超时:电子表格:为什么是现在?
- c - 从同一进程创建 N 个子进程,然后打印具有相关父进程的所有子进程的 PID
- pandas - Use pandas_udf with spark 2.2