如何在 Sequelize 现有模型中添加列?
How to add column in Sequelize existing model?
我已经使用此命令添加了模型和迁移文件
node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string
现在我想在现有 table(model) 中添加更多字段,例如性别和年龄。我手动更改模型并触发此命令
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;
};
提前谢谢你:)
为了向 table 添加新字段,我们应该使用如下所示的迁移框架。
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 迁移期望返回一个 promise,这在生成的迁移框架的注释中有注明:
Add altering commands here.
Return a promise to correctly handle asynchronicity.
Example:
return queryInterface.createTable('users', { id: Sequelize.INTEGER });
因此,返回一系列承诺可能会导致意外结果,因为无法保证在继续下一次迁移之前所有承诺都已解决。对于大多数操作,您不太可能 运行 遇到任何问题,因为大多数事情都会在 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
}
};
除了 @Suvethan Nantha 的回答对我有帮助之外,请确保将查询包装在 Promise.all 中,即 return **Promise.all**([queryInterface.addColumn(...)])
这样它将 return 一个承诺,因此可能会抛出错误。干杯!
在你的 sequelize 初始化中添加 alter
属性 为真,并将列或关联添加到你现有的模型文件中。
db.sequelize.sync({ force: false, alter: true })
来自相关 documentation:
User.sync({ alter: true })
这会检查数据库中 table 的当前状态(它有哪些列,它们的数据类型是什么,等等),然后在 table 中执行必要的更改使其与模型匹配。
我已经使用此命令添加了模型和迁移文件
node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string
现在我想在现有 table(model) 中添加更多字段,例如性别和年龄。我手动更改模型并触发此命令
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;
};
提前谢谢你:)
为了向 table 添加新字段,我们应该使用如下所示的迁移框架。
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
希望对您有所帮助。如果您有任何问题,请告诉我。
Add altering commands here.
Return a promise to correctly handle asynchronicity.
Example:
return queryInterface.createTable('users', { id: Sequelize.INTEGER });
因此,返回一系列承诺可能会导致意外结果,因为无法保证在继续下一次迁移之前所有承诺都已解决。对于大多数操作,您不太可能 运行 遇到任何问题,因为大多数事情都会在 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
}
};
除了 @Suvethan Nantha 的回答对我有帮助之外,请确保将查询包装在 Promise.all 中,即 return **Promise.all**([queryInterface.addColumn(...)])
这样它将 return 一个承诺,因此可能会抛出错误。干杯!
在你的 sequelize 初始化中添加 alter
属性 为真,并将列或关联添加到你现有的模型文件中。
db.sequelize.sync({ force: false, alter: true })
来自相关 documentation:
User.sync({ alter: true })
这会检查数据库中 table 的当前状态(它有哪些列,它们的数据类型是什么,等等),然后在 table 中执行必要的更改使其与模型匹配。