web-dev-qa-db-ja.com

typeormのPostgres列挙型

Typeormで、この生のクエリのようにpostgres列挙型を作成するにはどうすればよいですか性別

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

entityクラスで使用しますか?

私が試してみました

@Entity()
export class Person {
    @Column('enum')
    gender: 'male' | 'female'
}

しかし、「タイプ列挙型が存在しません」というエラーメッセージが表示されたため、これは明らかに正しい方法ではありません。

TypeScript列挙型も使用したくありません。データベースに0と1がたくさんあるからです。

7
Tai Tran

EDIT:この回答はまだ有効ですが、TypeORMの0.1.0アルファバージョンが両方の列挙型をサポートしているため、少し古くなっています PostgreSQL =およびMySQL。


PostgreSQLには列挙型が組み込まれていますが、残念ながら現在TypeORMMySQLでのみサポートされています

ただし、@Column型をintとして使用し、フィールド型に列挙型を使用することで、int型列挙型でも同様の結果を得ることができます。

enum Gender {
  Male,
  Female,
  Other
}

@Entity()
export class Person {
    @Column('int')
    gender: Gender
}

(このアプローチでは、必要に応じて @IsEnumデコレータfrom class-validator を使用して入力を検証できます)

文字列列挙型(TypeScript 2.4で利用可能、古いバージョンの場合は JSON文字列からのTypeScriptʻenum` を確認)を使用することもできます。その場合は、代わりにデータ型をstringに変更してください。 。

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

@Entity()
export class Person {
    @Column('text')
    gender: Gender
}
14
Felipe Sabino

受け入れられた回答が述べているように、これはpostgresでサポートされていますが、まだバグがあります: Githubの問題 、修正はおそらく次のRCでリリースされるでしょう。その間、私はスレッドで、実際の機能が完全に機能するよりも気に入った素晴らしいソリューションを見ました:

fwiwチェック制約付きの文字列列挙型を使用しています。これは、実際のpostgres列挙型よりもはるかに柔軟性があり、postgresインデックスにまったく新しいデータ型を作成し、管理が非常に困難です(テーブルの変更など)。

export function CheckEnum(tableName: string, fieldName: string, enumValue: any) {
  // Hash enum value and put it as part of constraint name so we can
  // force typeorm to generate migration for enum changes.
  const hash = crypto
    .createHash('sha1')
    .update(Object.values(enumValue).join(''))
    .digest('hex')
  return Check(
    // https://til.hashrocket.com/posts/8f87c65a0a-postgresqls-max-identifier-length-is-63-bytes
    `cke_${tableName}_${fieldName}_${hash}`.slice(0, 63),
    `${fieldName} in (${Object.values(enumValue).map(t => `'${t}'`)})`,
  )
}

そしてそれをそのように使う

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

@Entity()
@CheckEnum('person', 'gender', Gender)
export class Person {
2
Javier Aviles

Postgresの場合、文字列はDataTypeNotSupportedErrorになるため、列タイプは「string」ではなく「text」にする必要があります。「」のデータ型「string」は「postgres」データベースではサポートされていません。

1
William Saar