如何使用 knex.js 在 psql 中批量插入?
How to bulk insert in psql using knex.js?
我搜索了很多,这是一个已弃用的问题。
我正在尝试批量插入 table。
我的方法是这样的
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 列
但是我得到了这个错误:
invalid input syntax for type json
我该如何解决这个问题?
听起来有些 json 列在发送到数据库时没有将数据字符串化。
这也是插入多行最慢的方法,因为您对每个插入的行执行 1 个查询并使用单个连接进行插入。
并发 3 只会导致 pg 驱动程序缓冲这 2 个查询,然后再通过与所有其他查询相同的事务将它们发送到数据库。
像这样的东西应该是非常有效的(没有测试 运行 代码,所以可能会有错误):
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
可能适合您。
我搜索了很多,这是一个已弃用的问题。
我正在尝试批量插入 table。
我的方法是这样的
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 列
但是我得到了这个错误:
invalid input syntax for type json
我该如何解决这个问题?
听起来有些 json 列在发送到数据库时没有将数据字符串化。
这也是插入多行最慢的方法,因为您对每个插入的行执行 1 个查询并使用单个连接进行插入。
并发 3 只会导致 pg 驱动程序缓冲这 2 个查询,然后再通过与所有其他查询相同的事务将它们发送到数据库。
像这样的东西应该是非常有效的(没有测试 运行 代码,所以可能会有错误):
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
可能适合您。