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

如何在使用 Sequelize 更改列或添加新列时更新迁移文件

在生产中使用实体框架(代码优先)迁移

使用 Sequelize.js 进入包含模型

使用 Typescript 在 Sequelize 模型中创建实例方法

动态数据库模式 [关闭]