【问题标题】:Unhandled rejection SequelizeDatabaseError: type "enum_*" already exists未处理的拒绝 SequelizeDatabaseError:类型“enum_*”已经存在
【发布时间】:2020-07-08 21:41:28
【问题描述】:

我正在尝试使用以下用户模型将sequelize db 迁移到我的测试数据库,作为参考,以前也有过迁移。

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']
    }
});

但是这样做时,一旦执行了一些数据库查询,我就会收到以下错误。

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)

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

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

任何人有解决此问题的建议,无需硬完成数据库迁移。

【问题讨论】:

标签: node.js postgresql orm sequelize.js


【解决方案1】:

这似乎是 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')
                }
            }
        }
    },

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2016-07-21
  • 2018-10-15
  • 2018-12-18
  • 2019-09-19
  • 2019-06-02
  • 1970-01-01
  • 2018-12-15
  • 2018-06-23
  • 1970-01-01
相关资源
最近更新 更多