如何以编程方式运行sequelize迁移

Mon*_*key 7 sequelize.js

sequelize的文档似乎已经过时,因为它们不再支持从sequelize本身运行迁移,而是依赖于sequelize-cli.是否有一个如何以编程方式使用sequeliz-cli来运行最新迁移的示例?所有文档似乎都专注于在shell中使用客户端.

db.js似乎有我可以包含的函数db:migrate.

https://github.com/sequelize/cli/blob/master/lib/tasks/db.js

小智 18

我遇到了完全相同的问题并实现了接受的答案。然而,我在将其作为单独的进程运行时遇到了并发问题,尤其是在测试期间。

我认为这个问题相当老了,但它在搜索结果中仍然出现得很靠前。今天,使用 umzug 运行它是一个更好的主意。这是sequelize 用于管理其最终迁移的库,并且由docs建议。

const fs = require('fs');
const Umzug = require('umzug');
const path = require('path');
const Sequelize = require('sequelize');
const { sequelize } = require('../models/index.js');

const umzug = new Umzug({
  migrations: {
    // indicates the folder containing the migration .js files
    path: path.join(process.cwd(), './migrations'),
    // inject sequelize's QueryInterface in the migrations
    params: [
      sequelize.getQueryInterface(),
      Sequelize,
    ],
  },
  // indicates that the migration data should be store in the database
  // itself through sequelize. The default configuration creates a table
  // named `SequelizeMeta`.
  storage: 'sequelize',
  storageOptions: {
    sequelize,
  },
});

async function migrate() {
  return umzug.up();
}

async function revert() {
  return umzug.down({ to: 0 });
Run Code Online (Sandbox Code Playgroud)

这样,您就可以完成迁移所需的所有操作,而无需产生不同的进程,这会让您面临各种竞争条件和问题。阅读有关如何使用 umzug 和github上的文档的更多信息

  • 漂亮、优雅的解决方案。“希望当我最初遇到这个问题时就知道该怎么做。感谢分享。 (2认同)

bro*_*ofa 17

我深入研究了sequelize db:migrate命令的代码,那里有足够的东西,恕我直言,最简单/最好的方法是在子进程中运行命令。这是我用于此的代码(作为等待的承诺):

const {exec} = require('child_process');

await new Promise((resolve, reject) => {
  const migrate = exec(
    'sequelize db:migrate',
    {env: process.env},
    err => (err ? reject(err): resolve())
  );

  // Forward stdout+stderr to this process
  migrate.stdout.pipe(process.stdout);
  migrate.stderr.pipe(process.stderr);
});
Run Code Online (Sandbox Code Playgroud)