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がたくさんあるからです。
EDIT:この回答はまだ有効ですが、TypeORMの0.1.0
アルファバージョンが両方の列挙型をサポートしているため、少し古くなっています PostgreSQL =およびMySQL。
PostgreSQL
には列挙型が組み込まれていますが、残念ながら現在TypeORM
は MySQLでのみサポートされています 。
ただし、@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
}
受け入れられた回答が述べているように、これは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 {
Postgresの場合、文字列はDataTypeNotSupportedErrorになるため、列タイプは「string」ではなく「text」にする必要があります。「」のデータ型「string」は「postgres」データベースではサポートされていません。