Intend to modify a Enum column's default value? we can modify it without losing the original data. Here's an use case when original enum value for size column is small
, we're changing it to big
.
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
// Create a new enum type, make sure its name isn't the same as current column's enum type
await queryInterface.sequelize.query(`
CREATE TYPE enum_new_size AS ENUM ('big', 'medium', 'small');
`);
// Add a new temp column with the enum type, setting the new default value as 'big'
await queryInterface.addColumn('Shirts', 'sizeTemp', {
type: 'enum_new_size',
allowNull: false,
defaultValue: 'big',
});
// Copy over the old data to new column and cast to Enum values
await queryInterface.sequelize.query(`
UPDATE "Shirts"
SET "sizeTemp" = CASE
WHEN "size" = 'small' THEN CAST('small' AS enum_new_size)
WHEN "size" = 'medium' THEN CAST('medium' AS enum_new_size)
WHEN "size" = 'big' THEN CAST('big' AS enum_new_size)
ELSE CAST('big' AS enum_new_size)
END;
`);
// Remove the old column
await queryInterface.removeColumn('Shirts', 'size');
// Rename the temporary column
await queryInterface.renameColumn(
'Shirts',
'sizeTemp',
'size',
);
},
async down(queryInterface, Sequelize) {
/**
* Add reverting commands here.
*/
await queryInterface.removeColumn('Shirts', 'sizeTemp');
},
};
Top comments (0)