如何使用 Knex.js 将 1000 万行插入 MySQL 数据库?

Aar*_*shi 4 javascript mysql node.js knex.js

我正在尝试使用 Knex.js 将 10M+ 行插入 MySQL 数据库。有没有办法使用 for 循环插入长度为 10000 的数组(这似乎是我能够插入的最大大小 - 任何大于该值的数组都会出现“错误:ER_NET_PACKET_TOO_LARGE:得到的数据包大于'max_allowed_pa​​cket'字节”)。

我尝试使用承诺链,但该链对于容纳 10M 条记录来说会很长。

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());
              }
...
Run Code Online (Sandbox Code Playgroud)

Mik*_*stö 5

您可以使用https://knexjs.org/#Utility-BatchInsert来将大量行插入数据库。

await knex.batchInsert('books', create10MFakeBooks(), 5000)
Run Code Online (Sandbox Code Playgroud)

但是,您可能希望实际以较小的批量创建这些书籍,以防止使用千兆字节的内存。所以 MikaS 的答案是有效的,只需使用 async/await 就可以轻松编写。

我不会使用 knex 来完成这种工作,而是使用原始 SQL。