未处理的拒绝 SequelizeDatabaseError:类型“enum_*”已存在

Pas*_*ara 8 postgresql orm node.js sequelize.js

我试图sequelize使用以下用户模型对我的测试数据库执行数据库迁移,作为参考,之前也进行过迁移。

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']
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,在执行此操作时,一旦执行了一些数据库查询,我就会收到以下错误。

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)
Run Code Online (Sandbox Code Playgroud)

我使用的方法db.sync如下。

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

任何人都可以建议解决此问题,而无需进行硬性完整的数据库迁移。

小智 8

看来是postgres的问题。但是您可以使用此技术。有用。

    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')
                }
            }
        }
    },
Run Code Online (Sandbox Code Playgroud)