如何以编程方式运行续集播种机?

Dob*_*nov 1 javascript node.js sequelize.js

我是 NodeJS 和 Sequelize 的新手,我正在尝试在项目启动时执行续集播种器。

这是我的种子函数之一的示例。

filePath: src/database/seeders/20220402125658-default-filters.js

'use strict';

module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.bulkInsert('Filters', [
      {
        id: 'b16c15ce-9841-4ea5-95fb-0d21f8cd85f0', // TODO: use uuid4()
        name: 'Amount Filter',
        maxAmount: 200.0,
        minAmount: 0.2,
        createdAt: new Date(),
        updatedAt: new Date(),
      },
    ]);
  },

  async down(queryInterface, Sequelize) {
    await queryInterface.bulkDelete('Filters', null, bulkDeleteOptions);
  },
};

Run Code Online (Sandbox Code Playgroud)

在我的index.js 文件中,我正在执行sequelize.sync() 来同步我的数据库模型。这工作得很好,但我还想在同步完成时执行上面的种子代码。

filePath: src/database/index.js

db.sequelize.sync().then(() => {
// execute seeders here ...
});
Run Code Online (Sandbox Code Playgroud)

你知道我该怎么做吗?当我通过 npx 命令使用它时,播种工作正常npx sequelize-cli db:seed:all,但我想在项目启动时自动执行此操作。

小智 6

一种简单的方法可能是编写一个通过 Sequelize CLI 运行迁移/种子的脚本,并在您的脚本中添加调用它的脚本,例如package.json(或者可能只是)。然后只需运行即可启动应用程序。start./run-migrations.sh && node .sequelize-cli db:migrate && sequelize-cli db:seed:all && node .npm run start


除此之外,从表面上看,Sequelize 具有用于以编程方式应用迁移/种子的umzug库。请参阅本期中的评论,了解如何执行此操作。

我将在此处复制代码以防丢失:

/* <PROJECT_ROOT>/migrations.js */
var Umzug = require("umzug");
var models = require("./models");

var migrationsConfig = {
  storage: "sequelize",
  storageOptions: {
    sequelize: models.sequelize
    // modelName: 'SequelizeMeta' // No need to specify, because this is default behaviour
  },
  migrations: {
    params: [
      models.sequelize.getQueryInterface(),
      models.sequelize.constructor
    ],
    path: "./migrations", // path to folder containing migrations
    pattern: /\.js$/
  }
};

var seedsConfig = {
  storage: "sequelize",
  storageOptions: {
    sequelize: models.sequelize,
    modelName: 'SequelizeData' // Or whatever you want to name the seeder storage table
  },
  migrations: {
    params: [
      models.sequelize.getQueryInterface(),
      models.sequelize.constructor
    ],
    path: "./seeds", // path to folder containing seeds
    pattern: /\.js$/
  }
};

var migrator = new Umzug(migrationsConfig);
var seeder = new Umzug(seedsConfig);

module.exports = () => migrator.up().then(() => seeder.up());

/* <PROJECT_ROOT>/index.js */
var migrations = require("./migrations");

// Run migrations & seeds
migrations().then(function() {
  console.log("Migrations completed");
});
Run Code Online (Sandbox Code Playgroud)