Sequelize-CLI 添加列到现有模型
Sequelize-CLI Add Column to Existing Model
我已经阅读了大量的 sequelize-cli 文档,但似乎无法弄清楚如何将列添加到我已有的现有模型中。我有一个名为 models/team.js
的模型,我想使用 sequelize model:create --name team --attributes role_name:string
将名为 role_name
的列添加到模型中,但我收到一条消息,要求覆盖而不是修改:
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 进行,并且必须在迁移文件级别进行调整。
您需要另一个迁移文件来添加列。
up函数中需要添加
queryInterface.addColumn(
'nameOfAnExistingTable',
'nameofTheNewAttribute',
Sequelize.STRING)
在down函数中你需要
queryInterface.removeColumn(
'nameOfAnExistingTable',
'nameOfTheAttribute')
然后运行迁移。
如果您想在单个迁移中进行多项更改,您可以像这样 return 链式承诺:
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'));
},
};
我想我遇到了与您完全相同的问题。我试图找到一个 sequelize 命令,它将为我生成一个包含 queryInterface.addColumn
的迁移文件。但最终我明白这不可能只用一个命令就发生了。我们需要先创建迁移文件。
尝试使用运行 sequelize
命令查看所有可用选项。你会知道,如果你 运行 sequelize model:generate
(与 model:create
相同),你将同时创建模型和迁移的新文件。但是你想要迁移文件,但你不想要模型文件。这不是正确的命令。
所以如果你只是想添加列,你需要做的就是使用sequelize migration:generate
命令来创建迁移文件。如果您尝试 运行 该命令,您还会看到另一个选项,请注意有一个名为 --name
的选项,它被描述为必需的。只需根据需要提供一个描述性名称即可。示例命令:sequelize migration:generate --name add-registration-complete-and-currency-column
.
最后,使用 QueryInterface
修改您的迁移文件并在模型文件中手动添加该列。希望对你有帮助。
我已经阅读了大量的 sequelize-cli 文档,但似乎无法弄清楚如何将列添加到我已有的现有模型中。我有一个名为 models/team.js
的模型,我想使用 sequelize model:create --name team --attributes role_name:string
将名为 role_name
的列添加到模型中,但我收到一条消息,要求覆盖而不是修改:
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 进行,并且必须在迁移文件级别进行调整。
您需要另一个迁移文件来添加列。
up函数中需要添加
queryInterface.addColumn(
'nameOfAnExistingTable',
'nameofTheNewAttribute',
Sequelize.STRING)
在down函数中你需要
queryInterface.removeColumn(
'nameOfAnExistingTable',
'nameOfTheAttribute')
然后运行迁移。
如果您想在单个迁移中进行多项更改,您可以像这样 return 链式承诺:
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'));
},
};
我想我遇到了与您完全相同的问题。我试图找到一个 sequelize 命令,它将为我生成一个包含 queryInterface.addColumn
的迁移文件。但最终我明白这不可能只用一个命令就发生了。我们需要先创建迁移文件。
尝试使用运行 sequelize
命令查看所有可用选项。你会知道,如果你 运行 sequelize model:generate
(与 model:create
相同),你将同时创建模型和迁移的新文件。但是你想要迁移文件,但你不想要模型文件。这不是正确的命令。
所以如果你只是想添加列,你需要做的就是使用sequelize migration:generate
命令来创建迁移文件。如果您尝试 运行 该命令,您还会看到另一个选项,请注意有一个名为 --name
的选项,它被描述为必需的。只需根据需要提供一个描述性名称即可。示例命令:sequelize migration:generate --name add-registration-complete-and-currency-column
.
最后,使用 QueryInterface
修改您的迁移文件并在模型文件中手动添加该列。希望对你有帮助。