我试图运行一些数据库迁移,但我一直得到以下错误:DatabaseError [SequelizeDatabaseError]: type "public.enum_companies_accountingSwStatus" does not exist
我在另一个项目中做过同样的事情,它没有这个问题。
这真的让我很困扰,因为我在同一个表中使用了ENUM的其他列,它们似乎工作得很好,所以我不确定问题出在哪里。
以下是我的文件:
公司.型号.ts
const {
employeeSize,
revenueClass,
accountingSwStatus,
accountingSwType,
paymentFreq,
freeTrial,
} = enums.Company;
class Company extends Model {
public id!: number;
public employeeSize!: Enumerator;
public revenueClass!: Enumerator;
public accountingSwStatus!: Enumerator;
public accountingSwType!: Enumerator;
public static initModel(sequelize: Sequelize): void {
Company.init(
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
},
// works fine
employeeSize: {
type: DataTypes.ENUM,
values: getValues(employeeSize),
},
// works fine
revenueClass: {
type: DataTypes.ENUM,
values: getValues(revenueClass),
},
// error
accountingSwStatus: {
type: DataTypes.ENUM,
values: getValues(accountingSwStatus),
},
accountingSwType: {
type: DataTypes.ENUM,
values: getValues(accountingSwType),
},
},
{
sequelize,
modelName: 'companies',
}
);
}
迁移文件
module.exports = {
up: async (queryInterface, Sequelize) => {
try {
await queryInterface.createTable('companies', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
primaryKey: true,
},
// works fine
employeeSize: {
type: Sequelize.ENUM,
values: ['500', '100 - 500', '50 - 100', '10 - 50', '< 10'],
},
// works fine
revenueClass: {
type: Sequelize.ENUM,
values: [
'> 500M',
'100M - 500M',
'50M - 100M',
'10M - 50M',
'5M - 10M',
'1M - 5M',
'< 1M',
],
},
// error
accountingSwStatus: {
type: Sequelize.ENUM,
values: ['new', 'ended', 'failed to link'],
},
accountingSwType: {
type: Sequelize.ENUM,
values: ['quickbooks', 'xero'],
},
});
} catch (err) {
console.log(err);
}
},
down: (queryInterface) => queryInterface.dropTable('companies'),
};
我的枚举
const Company = {
employeeSize: {
TIER_ONE: '500',
TIER_TWO: '100 - 500',
TIER_THREE: '50 - 100',
TIER_FOUR: '10 - 50',
TIER_FIVE: '< 10',
},
revenueClass: {
TIER_ONE: '> 500M',
TIER_TWO: '100M - 500M',
TIER_THREE: '50M - 100M',
TIER_FOUR: '10M - 50M',
TIER_FIVE: '5M - 10M',
TIER_SIX: '1M - 5M',
TIER_SEVEN: '< 1M',
},
accountingSwStatus: {
NEW: 'new',
EXISTING: 'existing',
FAIL_TO_LINK: 'failed to link',
},
accountingSwType: {
QUICKBOOKS: 'quickbooks',
XERO: 'xero',
},
paymentFreq: {
MONTHLY: 'monthly',
YEARLY: 'yearly',
},
freeTrial: {
YES: 'yes',
NO: 'no',
ENDED: 'ended',
},
};
export default {
Company,
};
2条答案
按热度按时间5cg8jx4n1#
一个解决方案,我发现,为自己的工作是,而不是Sequelize.ENUM使用Sequelize.DataTypes.ENUM,它似乎在迁移有问题Sequelize.ENUM的原因,我发现大多数的答案只是做了它与纯sql
yjghlzjz2#
错误“SequelizeDatabaseError:type 'public.enum_...' does not exist”通常发生在您尝试在Sequelize模型中使用枚举数据类型,但在PostgreSQL数据库中未定义枚举类型时。要修复此错误,您需要执行以下步骤:
1.检查在数据库中创建的枚举类型的名称。您可以通过在PostgreSQL数据库中运行以下SQL命令来执行此操作:
SELECT * FROM pg_type WHERE typcategory = 'E';
1.很可能您的PostgreSQL数据库还没有相关的enum,下面exampleSQL命令创建enum类型:
CREATE TYPE enum_companies_accountingSwStatus AS ENUM('new','ended','未能链接');
您可以根据自己的需要进行调整。
1.尝试迁移回来。
另外,我在第一次迁移时遇到了同样的问题,然后我通过添加2列枚举来调整代码。当你尝试在同一个文件中运行第二次迁移时,会发生的情况是,这个问题只会发生在最新的2列枚举上,如果第一次迁移中有列枚举,那就不会有问题,因为枚举已经在PostgreSQL数据库中创建了。