Sequelize-CLI将列添加到现有模型

时间:2016-08-18 02:29:00

标签: sequelize.js sequelize-cli

我一直在阅读大量的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是否无法实现这一点,必须在迁移文件级别进行调整。

3 个答案:

答案 0 :(得分:7)

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

在向上功能中,您需要添加

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

在你需要的向下功能

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

然后运行迁移。

答案 1 :(得分: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'));
    },
};

答案 2 :(得分:0)

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

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

因此,如果您只想添加列,则只需使用sequelize migration:generate命令创建迁移文件即可。如果您尝试运行该命令,您还会看到其他选项,请注意,这里有一个名为--name的选项,描述为必需。只需根据需要提供描述性名称。示例命令:sequelize migration:generate --name add-registration-complete-and-currency-column

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