Postgres枚举类型

Tai*_*ran 2 postgresql typeorm

在typeorm中,如何在此原始查询中创建postgres枚举类型Gender

CREATE TYPE public.Gender AS ENUM (
    'male', 'female'
);
ALTER TABLE public.person ALTER COLUMN gender TYPE public.gender USING gender::gender;
Run Code Online (Sandbox Code Playgroud)

并在Entity类中使用它?

我试过了

@Entity()
export class Person {
    @Column('enum')
    gender: 'male' | 'female'
}
Run Code Online (Sandbox Code Playgroud)

但显然这不是正确的方法,因为我收到错误消息"类型枚举不存在".

我也不想使用typescript enum,因为它会在数据库中给我一堆0和1.

noa*_*ner 57

Postgres 的 TypeOrm 现在支持枚举

根据文档

postgres 和 mysql 支持 enum 列类型。有多种可能的列定义:

使用打字稿枚举:

export enum UserRole {
    ADMIN = "admin",
    EDITOR = "editor",
    GHOST = "ghost"
}

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column({
        type: "enum",
        enum: UserRole,
        default: UserRole.GHOST
    })
    role: UserRole;

}

Run Code Online (Sandbox Code Playgroud)

使用带有枚举值的数组:

export type UserRoleType = "admin" | "editor" | "ghost",

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column({
        type: "enum",
        enum: ["admin", "editor", "ghost"],
        default: "ghost"
    })
    role: UserRoleType;
}
Run Code Online (Sandbox Code Playgroud)


Fel*_*ino 10

编辑:这个答案仍然有效,但有点过时,因为0.1.0TypeORM的alpha版本支持PostgreSQL和MySQL的枚举.


PostgreSQL有一个内置的枚举类型,但遗憾的是TypeORM目前只支持MySQL.

但是,通过使用@Column类型as int和使用字段类型的枚举,可以使用int类型枚举实现类似的结果.

enum Gender {
  Male,
  Female,
  Other
}

@Entity()
export class Person {
    @Column('int')
    gender: Gender
}
Run Code Online (Sandbox Code Playgroud)

(这种方法允许您使用@IsEnum类验证器中装饰器来验证输入(如果需要))

您还可以使用字符串枚举(在TypeScript 2.4上可用,旧版本的JSON字符串中检查Typescript`enum`),如果是这种情况,只需将数据类型更改为string.

enum Gender {
  Male = 'male',
  Female = 'female',
  Other = 'other'
}

@Entity()
export class Person {
    @Column('text')
    gender: Gender
}
Run Code Online (Sandbox Code Playgroud)