Sequelize:在生产中更改模型架构
Posted
技术标签:
【中文标题】Sequelize:在生产中更改模型架构【英文标题】:Sequelize: Changing model schema on production 【发布时间】:2013-07-16 12:39:30 【问题描述】:我们使用 orm sequelize.js 并定义了这样的模型:
module.exports = function(sequelize, DataTypes)
var Source = sequelize.define('Source',
name:
type: DataTypes.STRING,
allowNull: false,
unique: true
,
paranoid: true
);
return Source;
;
这已部署到生产环境并使用 sequelize.sync
同步到数据库。下一步,我们添加一个参数:
module.exports = function(sequelize, DataTypes)
var Source = sequelize.define('Source',
name:
type: DataTypes.STRING,
allowNull: false,
unique: true
,
location:
type: DataTypes.STRING
,
paranoid: true
);
return Source;
;
但是,在部署到生产时sequelize.sync
不会添加这个新参数。这是因为sync
做了一个:
CREATE TABLE IF NOT EXISTS
如果表存在,则实际上不会更新架构。这是noted in their documentation。
唯一的选择似乎是 force: true
,但这对于生产数据库来说是不行的。
有谁知道在需要更改时如何正确更新架构?
【问题讨论】:
【参考方案1】:您想要实现 Sequelize 迁移:
http://docs.sequelizejs.com/manual/tutorial/migrations.html
这些将使您能够在已知状态之间转换开发人员、暂存和生产数据库。
【讨论】:
我对此有疑问。我可以使用 sequelize-cli 创建一个新模型及其相应的迁移脚本,使用 sequelize model:create 创建一个模型和迁移脚本,在添加新列或约束时有什么方法可以做到这一点。我们是否必须为这些任务手动编写迁移脚本,或者有什么方法可以自动生成迁移脚本。 这是sequelize的问题,我们必须手动编写mig脚本geez! 这是一个迁移示例github.com/abelnation/sequelize-migration-hello【参考方案2】:更快捷的方法是使用alter: true
选项。
参考:https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-method-sync
【讨论】:
文档说不建议在生产中使用:Not recommended for production use. Deletes data in columns that were removed or had their type changed in the model.
还有一个alter.drop
选项:Prevents any drop statements while altering a table when set to false
以上是关于Sequelize:在生产中更改模型架构的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 Sequelize 更改列或添加新列时更新迁移文件