LoginSignup
21
13

More than 3 years have passed since last update.

TypeORMのnullableまわりをどうにか回避する

Last updated at Posted at 2019-10-11

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;
21
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
13