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

bxgwgixi  于 2023-05-11  发布在  Node.js
关注(0)|答案(1)|浏览(87)

我已经通过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');
  }
};

但是我有一个CSV文件,其中有超过3000条记录,需要用作种子数据。它位于db文件夹中,名为survey.csv。我还有一个seeders文件夹,我认为它是由sequelize initsequelize migration:create自动创建的。目前是空的。
我可以使用Excel中的concatenate函数来创建有序的n元组数据,然后将这3000行粘贴到up的promise部分,但这似乎很荒谬。
我找到了一个类似问题的回复,但在Rails中:
你需要CSV库。the docs
arr_of_arrs = CSV.read("path/to/file.csv")
这将为您提供一个2D数组,您可以根据自己的喜好进行处理。CSV类似于IO.read,但有一些额外的功能,如头解析。
看起来有几个(或更多)csv***node***包,但是天哪,它们太复杂了(比如简单命名的csv)。
有没有一个更简单的csv解析器(比如Rails的那个),我可以用它来帮助将csv转储到数据库中?或者是另一种不需要从电子表格中复制大量多余代码的方法?

i2byvkas

i2byvkas1#

要使用Sequelize.js创建种子文件以从CSV文件中种子数据,您可以按照以下步骤操作:
1.安装必要的软件包:
npm install --保存sequelize sequelize-cli mysql2 csv-parser
这将安装Sequelize、Sequelize CLI、用于Sequelize的MySQL 2驱动程序和CSV解析器。
1.为表创建Sequelize模型。例如,如果您的CSV文件包含有关书籍的数据,则可以创建如下模型:
npx sequelize-cli model:generate --name Book --attributes title:string,author:string,year:integer
这将创建一个具有titleauthoryear属性的Book模型。
1.运行迁移以在数据库中创建表:
npx sequelize-cli db:migrate
1.使用Sequelize CLI在seeders目录中创建种子文件
npx sequelize-cli seed:generate --name seed-books
这将在seeders目录中创建一个新的种子文件。
1.编辑种子文件以读取CSV文件,解析其内容,并使用Sequelize将它们插入数据库。下面是一个例子:
常量fs =需要(“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, {});
  },
};

这段代码从./data/books.csv位置读取CSV文件,使用csv-parser包解析其内容,并使用Sequelize的bulkCreate方法将数据插入Book表。up函数用于将数据插入数据库,down函数用于在需要时删除数据。
1.运行seed将数据插入数据库:
npx sequelize-cli db:seed --seed seeders/seed-books.js
这将运行seed-books种子文件的up函数,并将数据插入数据库。
1.通过查询数据库来测试数据,以确保正确插入了CSV文件中的数据。
注意:在本例中,我假设CSV文件位于项目根目录下的data目录中。您需要根据自己项目的需要调整文件路径。

相关问题