如何在 Sequelize 现有模型中添加列?
Posted
技术标签:
【中文标题】如何在 Sequelize 现有模型中添加列?【英文标题】:How to add column in Sequelize existing model? 【发布时间】:2018-09-28 04:21:38 【问题描述】:我已经使用这个命令添加了一个模型和一个迁移文件
node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string
现在我想在现有表(模型)中添加更多字段,例如性别和年龄。我手动更改模型并触发此命令
node_modules/.bin/sequelize db:migrate
但它的响应是“没有执行迁移,数据库架构已经是最新的。 "
User.js
'use strict';
module.exports = (sequelize, DataTypes) =>
var User = sequelize.define('User',
firstName: DataTypes.STRING,
lastName: DataTypes.STRING,
email: DataTypes.STRING
, );
User.associate = function(models)
// associations can be defined here
;
return User;
;
提前谢谢你:)
【问题讨论】:
能否将 User.js 文件附加到问题中? 我已经添加了 user.js 文件!请检查 检查答案,如果您有困难,请告诉我 【参考方案1】:在您的 sequelize 初始化中添加 alter
属性为 true,并将列或关联添加到您现有的模型文件中。
db.sequelize.sync( force: false, alter: true )
【讨论】:
【参考方案2】:除了 @Suvethan Nantha 的回答顺便帮助了我,确保你将查询包装在 Promise.all 中,即返回 **Promise.all**([queryInterface.addColumn(...)])
以便它返回一个承诺,因此可能会抛出错误。干杯!
【讨论】:
【参考方案3】:Suvethan's answer 是正确的,但是迁移代码 sn -p 有一个小错误。 Sequelize 迁移期望返回一个承诺,这在生成的迁移框架中的注释中注明:
Add altering commands here.
Return a promise to correctly handle asynchronicity.
Example:
return queryInterface.createTable('users', id: Sequelize.INTEGER );
因此,返回一组 Promise 可能会导致意外结果,因为无法保证所有 Promise 都会在继续下一次迁移之前得到解决。对于大多数操作,您不太可能遇到任何问题,因为大多数事情都会在 Sequelize 关闭进程之前完成。但我认为在数据库迁移方面,安全总比后悔好。您仍然可以利用一系列承诺;您只需将其包装在 Promise.all
调用中。
Suvethan 的示例,但使用 Promise.all:
module.exports =
up: function (queryInterface, Sequelize)
return Promise.all([
queryInterface.addColumn(
'Users',
'gender',
Sequelize.STRING
),
queryInterface.addColumn(
'Users',
'age',
Sequelize.STRING
)
]);
,
down: function (queryInterface, Sequelize)
// logic for reverting the changes
;
【讨论】:
"Promise.all" 在我的情况下丢失并引发异常。谢谢 我建议使用事务来对addColumn
进行分组,因此如果其中一个失败,所有都可以优雅地回滚,目前在文档中进行了演示:sequelize.org/v5/manual/migrations.html【参考方案4】:
为了向表中添加新字段,我们应该使用如下所示的迁移骨架。
sequelize migration:create --name Users
打开迁移文件并添加以下代码
module.exports =
up: function (queryInterface, Sequelize)
return [ queryInterface.addColumn(
'Users',
'gender',
Sequelize.STRING
),
queryInterface.addColumn(
'Users',
'age',
Sequelize.STRING
)];
,
down: function (queryInterface, Sequelize)
// logic for reverting the changes
;
然后运行迁移
node_modules/.bin/sequelize db:migrate
注意:传入的queryInterface对象可以用来修改数据库。 Sequelize 对象存储可用的数据类型,例如 STRING 或 INTEGER。
Full list of methods in Query Interface
我希望这会对你有所帮助。如果您有任何问题,请告诉我。
【讨论】:
以上是关于如何在 Sequelize 现有模型中添加列?的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 Sequelize 更改列或添加新列时更新迁移文件