typescript 序列化数据库错误:类型“public.enum_...”不存在

nwlls2ji  于 2023-03-31  发布在  TypeScript
关注(0)|答案(2)|浏览(215)

我试图运行一些数据库迁移,但我一直得到以下错误:
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,
};
5cg8jx4n

5cg8jx4n1#

一个解决方案,我发现,为自己的工作是,而不是Sequelize.ENUM使用Sequelize.DataTypes.ENUM,它似乎在迁移有问题Sequelize.ENUM的原因,我发现大多数的答案只是做了它与纯sql

yjghlzjz

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数据库中创建了。

相关问题