Unhandled rejection SequelizeDatabaseError: type "enum_*" already exists

Viewed 2516

I was attempting to perform a sequelize db migration to my test database with the following user model, for the reference there had been a previous migration as well.

const User = Sequelize.define('user', {
    user_id: {
        type: sequelize.STRING,
        primary_key: true,
    },
    firstName:{
        type: sequelize.STRING,
        allowNull: false
    },
    lastName:{
        type: sequelize.STRING
    },
    dob:{
        type: sequelize.DATE
    },
    birth_time:{
        type: sequelize.TIME,
        allowNull: true
    },
    gender:{
        type: sequelize.ENUM,
        values: ['male', 'female']
    }
});

But while doing so I am receiving the following error once a few db queries are executed.

Unhandled rejection SequelizeDatabaseError: type "enum_yyy" already exists
    at Query.formatError (/home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/sequelize/lib/dialects/postgres/query.js:366:16)
    at /home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/sequelize/lib/dialects/postgres/query.js:72:18
    at tryCatcher (/home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/caesar/Workspace/xxx/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/bluebird/js/release/promise.js:689:18)
    at Async._drainQueue (/home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/caesar/Workspace/Devmetry/Projects/xxx/node_modules/bluebird/js/release/async.js:17:14)
    at processImmediate (internal/timers.js:456:21)
    at process.topLevelDomainCallback (domain.js:137:15)

The db.sync method that I have utilized is as follows.

Sequelize.sync({ alter: true })
  .then(() => {
    console.log(`Database & tables generated!`)
});

Anyone having suggestions on fixing this issue, without a hard complete db migration.

1 Answers

It seems an issue with postgres. However you can use this technique. It works.

    gender: {
        type: DataTypes.STRING,
        allowNull: false,
        defaultValue: 'male',
        validate: {
            customValidator: (value) => {
                const enums = ['male', 'female']
                if (!enums.includes(value)) {
                    throw new Error('not a valid option')
                }
            }
        }
    },
Related