javascript - 如何使用 Knex.js 向 MySQL 数据库中插入 1000 万行?

标签 javascript mysql node.js knex.js

我正在尝试使用 Knex.js 将超过 1000 万行插入 MySQL 数据库。有没有一种方法可以使用 for 循环插入长度为 10000 的数组(这似乎是我能够插入的最大大小 - 任何大于该长度的内容都会出现“错误:ER_NET_PACKET_TOO_LARGE:得到一个大于‘max_allowed_pa​​cket’字节的数据包”)。

我尝试使用 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());
              }
...

最佳答案

如果您使用 asyncawait 并放弃 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/

相关文章:

javascript - 带有数组值的 JSON 字典到 C# 对象

php - php/mysql 更新新手

node.js - ExpressJS 删除连接

javascript - 有没有类似websocket但不需要像node这样的框架的东西?

javascript - 基本 While 循环查询 - 为什么记录 "1"?

javascript - 从 AudioData/Web Audio API 获取所有样本

php - 从 mySQL 数据库显示单个值的更有效方法?

javascript - 我将如何通过与另一个数组进行比较来更改 MySQL 数组?

javascript - Moment.js 返回 "December 31, 1969"

javascript - 在 JS 和 CSS 中保持文本恰好为 N 行