【问题标题】:How do you add enum labels using sequelize?如何使用 sequelize 添加枚举标签?
【发布时间】:2019-04-03 13:04:20
【问题描述】:

我有一个叫做字符的表。每个字符都有一个名为“状态”的枚举,可以是“悲伤”或“快乐”。如何在我的专栏中添加一个“困惑”的新状态?我尝试了此迁移,但失败了:

migration.describeTable('characters').success(function (attributes) {
    migration.changeColumn('characters', 'state',
        {
            type: DataTypes.ENUM,
            values: ['sad', 'happy', 'confused']
        })
        .complete(done);
});

它抱怨错误:类型“enum_characters_state”已经存在。

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    扩展 briangonzalez 答案,您还需要一个 down 函数来撤消迁移:

    'use strict';
    
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.sequelize.query("ALTER TYPE enum_type_name ADD VALUE 'new_value'");
      },
    
      down: (queryInterface, Sequelize) => {
        var query = 'DELETE FROM pg_enum ' +
          'WHERE enumlabel = \'new_value\' ' +
          'AND enumtypid = ( SELECT oid FROM pg_type WHERE typname = \'enum_type_name\')';
        return queryInterface.sequelize.query(query);
      }
    };
    

    更改 enum_type_namenew_value 以满足您的需求。

    【讨论】:

    • 这是最准确和最完整的答案,这应该是这个问题接受的答案。
    【解决方案2】:

    使用最新版本的 Sequelize,您可以通过运行查询来实现这一点(假定为 Postgres):

    module.exports = {
      up: function (queryInterface, Sequelize) {
        return queryInterface.sequelize.query("ALTER TYPE enum_character_state ADD VALUE 'confused';");
      }
    };
    

    【讨论】:

      【解决方案3】:

      使用以下脚本创建迁移:

      module.exports = {
        up  : function (queryInterface) {
          return queryInterface
            .changeColumn(tableName, columnName, {
              values: arrayOfNewValues
            });
        },
        down: function (queryInterface) {
          return queryInterface
            .changeColumn(tableName, columnName, {
              values: arrayOfOldValues
            });
        }
      };
      

      【讨论】:

      • 这应该是被接受的。这是较少依赖数据库的解决方案。
      • 这个对我来说不适用于 PostgreSQL - 它抱怨枚举类型已经存在。
      【解决方案4】:

      如果要重新添加,则需要删除该类型。如果没有别的,在向下迁移中很有用。

      queryInterface.sequelize.query('DROP TYPE enum_characters_state;')
      

      【讨论】:

        猜你喜欢
        • 2011-11-15
        • 2014-07-31
        • 2021-02-14
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多