TL;DR
@Column({ nullable: true, type: 'varchar', width: 64 })
nickname: string | null;
とする。
問題
以下の記事の"2, デフォルトNULLのカラム"のような問題がある。
TypeORMでエンティティを定義する際のガイドライン
https://tech.bitbank.cc/typeorm-entity-guideline/
以下のように設定すると
@Column({ nullable: true })
nickname?: string;
nicknameはTypescript上は string|undefined
だが、値はnullになっている。
記事中では、以下のような形にしていたが、DataTypeNotSupportedError
としてエラーが発生した。
@Column({ nullable: true })
nickname: string | null;
{ DataTypeNotSupportedError: Data type "Object" in "User.nickname" is not supported by "postgres" database.
記事ではstring
ではなくDate
を使っていたが、Date
の場合も同様だった。
データベースのエンジンが記事とは違うなどがあるのかもしれない。
解決(むりやり)
記事中にあるようにtransformer
で変換するのは現状できないっぽいので、setter / getter
で回避した。
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column({ name: 'nickname', nullable: true })
nicknameV?: string
get nickname(): string | undefined {
return this.nicknameV !== null ? this.nickname : undefined
}
set nickname(v: string | undefined) {
this.nicknameV = v
}
}
もうちょっといい感じのやり方あれば知りたい
追記
データベース内の型を明示すればよいのではと思ってやってみたらいけた。
これが1番よい気がする。
@Column({ nullable: true, type: 'varchar', width: 64 })
nickname: string | null;