【问题标题】:Sequelize is not updated when I added new column in table当我在表中添加新列时,Sequelize 未更新
【发布时间】:2016-07-07 11:32:57
【问题描述】:

我无法说服为什么当我在表中添加新列时我的续集模型没有更新。

我在我的表中添加了新列“status INTEGER”,并在我的表的模型中进行了如下更新。当我从表中检索值时,它什么也没有。

            },
            status: {
                type: DataTypes.INTEGER,
                default: 0
            }

请帮我解决这个问题。甚至我也按如下方式运行迁移。

module.exports = {
    up: function (migration, DataTypes, done) {

        function addDisabledColumn() {
            return migration.addColumn('applications', 'status',
                {
                    type: DataTypes.INTEGER,
                    default: 0
                }
            )
        }

        addDisabledColumn().then(function () {
            done();
        }, function (err) {
            done(err);
        });

    },
    down: function (migration, DataTypes, done) {
        done()
    }
};

【问题讨论】:

    标签: node.js postgresql express sequelize.js


    【解决方案1】:

    现在,如果您查看 API Reference 并滚动到 public async sync 方法。您将看到带有dropalter 选项,这意味着我们可以使用sequalize.sync({alter:true, drop: false}) 来更新模型列而无需删除语句。

    它应该更新表中缺少的列,并且可以安全地用于生产。

    【讨论】:

      【解决方案2】:

      当我从表中检索值时,它什么也没有。

      同样的事情也发生在我身上。我创建了一个向表添加列的迁移。当我使用.findAll.findOnefindAllAndCount 等时,该列将不存在。

      您可以通过两种方式获取新列:

      • 将新列添加到模型定义中。这不仅需要使用.find 查询获取新列,而且还需要在调用.create 时保存该列。如果这不起作用:

      • 使用attributes 并明确定义要检索的新列:

         const employee = await Employee.findOne({
             where: { id: id },
             attributes: ['id', 'name', 'NEW_COLUMN'],
         });
        
      • 如果您要在多个位置查询表,最好为您要查询的字段创建一个别名,并在您运行 find 查询的任何地方使用它:

         const Employee = sequelize.define('employee', {
             id: {
                 type: DataTypes.INTEGER,
                 primaryKey: true,
                 autoIncrement: true
             }, 
             // DONT FORGET TO ADD THE NEW COLUMN TO YOUR MODEL
             NEW_COLUMN: {
                 type: DataTypes.STRING,
                 allowNull: true,
             }
             // ...
         });
        
         Employee.basicAttributes = (alias = 'employee') => [
             'id', 
             'name',
             'NEW_COLUMN',
             // ...
         ];
        
         const employee = await Employee.findOne({
             where: { id: id },
             attributes: Employee.basicAttributes(),
         });
        

      这并不理想,但它可以工作,并且不需要运行sequalize.sync({force:true})

      【讨论】:

        【解决方案3】:

        您需要重新同步表以使更改生效尝试sequalize.sync({force:true}) 希望对你有帮助:)

        【讨论】:

        • 我需要在哪里放置 'sequalize.sync({force:true})' 以及何时需要运行该脚本?
        • 当您第一次创建表时,您必须同步数据库。告诉我你的代码,然后我会告诉你。您还可以在“您的第一个模型”sequelize.readthedocs.org/en/latest/docs/getting-started 下的文档中查看
        • 如果您正在使用迁移,您应该运行迁移以使更改生效阅读这篇文章应该可以消除您的疑虑sequelize.readthedocs.org/en/latest/docs/migrations,我建议您阅读 sequalize 文档
        • 是的,我已经阅读了该文档。即使运行迁移,新列也已添加到我的表中,但“Sequelize”即使在表中也无法识别该新列。
        • 警告:这会删除表中的每条记录
        猜你喜欢
        • 1970-01-01
        • 2015-12-25
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多