我正在尝试使用 Knex.js 将超过 1000 万行插入 MySQL 数据库。有没有一种方法可以使用 for 循环插入长度为 10000 的数组(这似乎是我能够插入的最大大小 - 任何大于该长度的内容都会出现“错误:ER_NET_PACKET_TOO_LARGE:得到一个大于‘max_allowed_packet’字节的数据包”)。
我尝试使用 promise 链,但链会很长以容纳 1000 万条记录。
exports.seed = (knex) => {
// Deletes ALL existing entries
return knex('books').del()
.then(() => {
const fakeBooks = [];
for (let i = 0; i < 10000; i += 1) {
fakeBooks.push(createFakeBooks());
}
return knex('books').insert(fakeBooks)
.then(() => {
const fakeBooks1 = [];
for (let i = 0; i < 10000; i += 1) {
fakeBooks1.push(createFakeBooks());
}
return knex('books').insert(fakeBooks1)
.then(() => {
const fakeBooks2 = [];
for (let i = 0; i < 10000; i += 1) {
fakeBooks2.push(createFakeBooks());
}
...
最佳答案
如果您使用 async
和 await
并放弃 then
会更容易。然后可以这样写:
exports.seed = async (knex) => {
await knex('books').del();
let fakeBooks = [];
for (let i = 1; i <= 10000000; i += 1) {
fakeBooks.push(createFakeBooks());
if (i % 1000 === 0) {
await knex('books').insert(fakeBooks);
fakeBooks = [];
}
}
};
await
将使 promise 在函数继续之前完成,而不会阻塞线程。该循环将运行一千万次并每 1000 行插入到数据库中。您可以将其更改为 10000 行,但您也可以使用 1000 行以确保安全。
我自己只尝试了 100 万行,因为插入 1000 万行花费了太多时间。
关于javascript - 如何使用 Knex.js 向 MySQL 数据库中插入 1000 万行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56225403/