使用 Knex.js 的批量插入错误:绑定消息提供 X 参数,但准备语句“”需要 Y

Bulk Insert Error using Knex.js: bind message supplies X parameters, but prepared statement "" requires Y

当使用 Knex.js 对 PostgreSQL 11.2 执行大型 INSERT 时,

await knex(myTable).insert(largeArray);

我们收到错误

bind message supplies 47078 parameters, but prepared statement "" requires 9353190

问题: 有没有办法在不使用绑定的情况下在 Knex.js 中进行大量插入?或者我们可以更改 PostgreSQL 中的参数以允许像这样的大型插入?

我相信我已经使用 Sequelize.js ORM 执行类似大小的插入(大小的 1/2)而没有出现此类错误,但我们目前的目的不希望使用 ORM。

使用 knex 0.20.9,Node.js 12.14.1,PostgreSQL 11.2,TimescaleDB 1.6.0,Ubuntu 18.04.3

您需要批量添加数据。 knex 中有一个名为 batchInsert() 的实用函数来帮助完成它。数据库的语句大小/绑定数量有限。 Sequelize 可能在内部进行批处理,因为它无法覆盖数据库服务器施加的限制。

如果您不想使用 ORM,您可以尝试 objection.js 它更像是一个在 knex 之上的高级帮助程序库,用于处理常用的东西,而不是真正的 ORM。