如何轻松解析 csv 文件以在 Node.js 续集数据库迁移策略中使用?

Bon*_*our 5 mysql csv database-migration node.js sequelize-cli

我已经通过sequelize-cli 设置并运行了迁移策略,以便可以正确构建表。它可以使用sequelize db:migrate并且可以很好地创建表格。并sequelize db:migrate:undo会删除该表。

我还包含了插入几条记录的代码(根据此处的 SE 注释)。这也有效。这是所有这些的代码:

'use strict';

module.exports = {
  up: function(queryInterface, DataTypes, done) {
    return queryInterface.createTable('survey', {
      id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      state: {
        type: DataTypes.TEXT
      },
      age: {
        type: DataTypes.INTEGER
      },
      race: {
        type: DataTypes.TEXT
      },
      gender: {
        type: DataTypes.TEXT
      },
      education: {
        type: DataTypes.TEXT
      },
      q1: {
        type: DataTypes.INTEGER
      },
      q2: {
        type: DataTypes.INTEGER
      },
      .
      .
      .
      q24: {
        type: DataTypes.INTEGER
      },
      q25: {
        type: DataTypes.INTEGER
      }
    }).then(function() {
      queryInterface.sequelize.query("INSERT INTO survey (state, age, race, gender, q1, q7, q24) VALUES ('Texas', 42, 'white', 'female', 5, 4, 3), ('Louisiana', 19, 'hispanic', 'male', 1, 2,5)");
      done();
    });
  },

  down: function(queryInterface, Sequelize) {
    return queryInterface.dropTable('survey');
  }
};
Run Code Online (Sandbox Code Playgroud)

但我有一个包含 3000 多条记录的 CSV 文件,需要用作种子数据。它位于db文件夹中,名为survey.csv. 我还有一个seeders文件夹,我认为它是由sequelize init或自动创建的sequelize migration:create。目前是空的。

可以使用 Excel 中的串联函数来创建有序的 n 元组数据,然后将这 3000 行插入并粘贴到 的 Promise 部分中up,但这似乎很荒谬。

我找到了类似问题的答复,但在 Rails 中:

您需要 CSV 库。来自文档

arr_of_arrs = CSV.read("path/to/file.csv")

这将为您提供一个二维数组,您可以根据需要对其进行处理。CSV 与 类似IO.read,但有一些额外功能,例如标头解析。

看起来有几个(或更多) csv节点包,但是天哪,它们太复杂了(就像简单命名的csv)。

是否有一种更简单的 csv 解析器(如 Rails 解析器)可以用来方便将 csv 转储到数据库中?或者另一种不需要从电子表格复制大量多余代码的方法?

小智 0

要使用 Sequelize.js 创建种子文件以从 CSV 文件中播种数据,您可以按照以下步骤操作:

  1. 安装必要的软件包:

    npm install --save续集sequelize-cli mysql2 csv-parser

    这将安装 Sequelize、Sequelize CLI、Sequelize 的 MySQL2 驱动程序和 CSV 解析器。

  2. 为您的表创建 Sequelize 模型。例如,如果您的 CSV 文件包含有关书籍的数据,您可以创建如下模型:

    npx Sequelize-cli 模型:生成 --name Book --attributes 标题:字符串,作者:字符串,年份:整数

    这将创建一个具有、和属性Book的模型。titleauthoryear

  3. 运行迁移以在数据库中创建表:

    npx Sequelize-cli db:migrate

  4. seeders使用 Sequelize CLI 在目录中创建种子文件

    npx Sequelize-cli 种子:生成 --name 种子书

    这将在目录中创建一个新的种子文件seeders

  5. 编辑种子文件以读取 CSV 文件,解析其内容,然后使用 Sequelize 将它们插入到数据库中。这是一个例子:

    const fs = require('fs'); const csv = require('csv-parser'); const Book = require('../models/book');

    module.exports = {
      up: (queryInterface, Sequelize) => {
        const results = [];
        return new Promise((resolve, reject) => {
          fs.createReadStream('./data/books.csv')
            .pipe(csv())
            .on('data', (data) => {
              results.push(data);
            })
            .on('end', () => {
              Book.bulkCreate(results)
                .then(() => {
                  resolve();
                })
                .catch((error) => {
                  console.error(error);
                  reject(error);
                });
            });
        });
      },
    
      down: (queryInterface, Sequelize) => {
        return queryInterface.bulkDelete('Books', null, {});
      },
    };
    
    Run Code Online (Sandbox Code Playgroud)

    此代码从该位置读取 CSV 文件./data/books.csv,使用包解析其内容,并使用Sequelize 方法csv-parser将数据插入到表中。该函数用于将数据插入数据库,如果需要,该函数用于删除数据。BookbulkCreateupdown

  6. 运行种子将数据插入数据库:

    npx Sequelize-cli db:seed --seed seers/seed-books.js

    这将运行种子文件up的功能seed-books并将数据插入数据库。

  7. 通过查询数据库来测试数据,以确保 CSV 文件中的数据已正确插入。

    注意:在此示例中,我假设 CSV 文件位于data项目根目录中。您需要根据自己的项目的需要调整文件路径。