【问题标题】:Sequelize: Changing model schema on productionSequelize:在生产中更改模型架构
【发布时间】: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 },但这对于生产数据库来说是不行的。

有谁知道在需要更改时如何正确更新架构?

【问题讨论】:

    标签: javascript postgresql orm database-schema sequelize.js


    【解决方案1】:

    您想要实现 Sequelize 迁移:

    http://docs.sequelizejs.com/manual/tutorial/migrations.html

    这些将使您能够在已知状态之间转换开发人员、暂存和生产数据库。

    【讨论】:

    • 我对此有疑问。我可以使用 sequelize-cli 创建一个新模型及其相应的迁移脚本,使用 sequelize model:create 创建一个模型和迁移脚本,在添加新列或约束时有什么方法可以做到这一点。我们是否必须为这些任务手动编写迁移脚本,或者有什么方法可以自动生成迁移脚本。
    • 这是sequelize的问题,我们必须手动编写mig脚本geez!
    【解决方案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
    猜你喜欢
    • 2016-08-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多