4

我一直在阅读大量的 sequelize-cli 文档,但似乎无法弄清楚如何将列添加到我已有的现有模型中。我有一个名为的模型,models/team.js并想用 向role_name模型添加一个名为的列sequelize model:create --name team --attributes role_name:string,但我收到一条消息,要覆盖而不是修改:

Loaded configuration file "config/config.json".
Using environment "development".
The file /Users/user/Desktop/Projects/node/app-repo/app/models/team.js already exists. Run "sequelize model:create --force" to overwrite it.

我不想覆盖让我认为这不是正确使用命令的文件。这也让我想知道这是否无法从 cli 中进行,并且必须在迁移文件级别进行调整。

4

3 回答 3

10

您需要另一个迁移文件来添加列。

在 up 函数中你需要添加

 queryInterface.addColumn(
     'nameOfAnExistingTable',
      'nameofTheNewAttribute',
      Sequelize.STRING)

在向下功能中,您需要

queryInterface.removeColumn(
      'nameOfAnExistingTable',
      'nameOfTheAttribute')

然后运行迁移。

于 2016-11-21T02:37:58.727 回答
3

如果您想在单个迁移中进行多项更改,您可以像这样返回链式承诺:

module.exports = {
up: function (queryInterface, Sequelize) {
    return queryInterface.addColumn('yourTableName', 'firstNewColumnName', Sequelize.STRING)
        .then(_ => queryInterface.addColumn('yourTableName', 'secondNewColumnName', Sequelize.STRING))
        .then(_ => queryInterface.addColumn('yourTableName', 'thirdNewColumnName', Sequelize.STRING));
    },

down: function (queryInterface, _Sequelize) {
    return queryInterface.removeColumn('yourTableName', 'firstNewColumnName')
        .then(_ => queryInterface.removeColumn('yourTableName', 'secondNewColumnName'))
        .then(_ => queryInterface.removeColumn('yourTableName', 'thirdNewColumnName'));
    },
};
于 2017-09-15T13:41:06.333 回答
2

我想我和你有完全相同的问题。我试图找到一个 sequelize 命令,它将在其中生成一个迁移文件queryInterface.addColumn。但最终我明白了,它不可能只发生在一个命令中。我们需要先创建迁移文件。

尝试运行sequelize命令以查看所有可用选项。您会知道,如果您运行sequelize model:generate(与 相同model:create),您将同时创建模型和迁移的新文件。但是你想要迁移文件,但你不想要模型文件。这不是正确的命令。

因此,如果您只想添加列,您需要做的就是使用sequelize migration:generate命令创建迁移文件。如果您尝试运行该命令,您还将看到另一个选项,请注意有一个名为的选项--name,它按要求进行了描述。只需根据需要提供描述性名称。示例命令:sequelize migration:generate --name add-registration-complete-and-currency-column.

最后,使用手动修改您的迁移文件QueryInterface并在模型文件中添加该列。我希望它有所帮助。

于 2018-05-15T22:45:46.647 回答