在TypeORM中使用實體@Entity與字段@Column註解

在TypeORM中使用實體@Entity與字段@Column註解

客觀存在並相互區別的事物稱爲實體(Entity)。
實體是一個抽象名詞,是指一個獨立的事物個體,自然界的一切具體存在的事物都可以看做一個實體。
就數據庫而言,實體往往指某類事物的集合。

比如MySQL數據庫中,一個表todo的結構如下:

CREATE TABLE `todo` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) unsigned NOT NULL DEFAULT '0',
  `title` varchar(255) NOT NULL DEFAULT '',
  `description` text NOT NULL,
  `views` int(11) unsigned NOT NULL DEFAULT '0',
  `is_star` tinyint(4) NOT NULL DEFAULT '0',
  `is_finish` tinyint(11) unsigned NOT NULL DEFAULT '0',
  `create_time` int(11) unsigned NOT NULL DEFAULT '0',
  `update_time` int(11) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

TypeORM 中定義一個實體類,對應一個數據庫的表(或MongoDB的集合),可以通過 @Entity() 註解實現.

默認的,類名應該和表名一直,比如以下示例中的class名爲Todo, 表名對應爲todo

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Todo {
  @PrimaryGeneratedColumn() 
  id: number;
  
  @Column('int') 
  user_id: number;

  @Column({ length: 255 })
  title: string;

  @Column('text') 
  description: string;

  @Column('tinyint') 
  is_finish: boolean;

  @Column('int') 
  create_time: number;  
  
  @Column('int') 
  update_time: number;
}

如果實體類名和表名不一致,可以在@Entity()註解中傳入表名字段。

// 表名: my_todo_list
@Entity('my_todo_list')

獲取一條記錄結果:

{
    "id": 12,
    "user_id": 112233,
    "title": "learn TypeORM",
    "description": "hello,TypeORM",
    "views": 2,
    "is_star": false,
    "is_finish": 0,
    "create_time": 1545198789,
    "update_time": 1545198789
}

實體的列表(Columns)

// 主鍵
@PrimaryColumn()
id: number;

// 自增主鍵
@PrimaryGeneratedColumn()
id: number;

// int型普通字段
@Column("int")
user_id: number;

// tinyint型普通字段
@Column('tinyint') 
is_finish: boolean;

@Column()
title: string;

支持的字段類型(mysql/mariadb):

// Column types for mysql / mariadb
int, tinyint, smallint, mediumint, bigint, float, double, dec, 
decimal, numeric, date, datetime, timestamp, time, year, char, 
varchar, nvarchar, text, tinytext, mediumtext, blob, longtext, 
tinyblob, mediumblob, longblob, enum, json, binary, geometry, 
point, linestring, polygon, 
multipoint, multilinestring, multipolygon, 
geometrycollection

@Column()註解中,可以傳入一個Object,可以指定字段的類型、大小等待屬性:

// 指定爲 int 類型
@Column("int")
// or
@Column({ type: "int" })

// 指定爲 varchar 類型, 長度200個字符
@Column("varchar", { length: 200 })
// or
@Column({ type: "varchar", width: 200 })

有的時候,我們接口返回值和數據庫字段不是一一對應的。

如果想要實體名稱與表字段名稱不同, 設置name屬性即可:

@Column({type:'int', name: 'user_id'}) 
userId: number;

@Column({type:'int', name: 'create_time'}) 
createTime: number;  

@Column({type:'tinyint', name: 'is_finish'}) 
isFinish: boolean;

修改後代碼如下:

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

// 表名爲: my_todo_list
@Entity('my_todo_list')
export class Todo {
  @PrimaryGeneratedColumn() 
  id: number;
  
  @Column({type:'int', name: 'user_id'}) 
  userId: number;

  @Column({ length: 255 })
  title: string;

  @Column('text') 
  description: string;

  @Column({type:'int', name: 'is_finish'}) 
  isFinish: boolean;

  @Column({type:'int', name: 'create_time'}) 
  createTime: number;  
  
  @Column({type:'int', name: 'update_time'}) 
  updateTime: number;
}

獲取一條記錄結果:

{
    "id": 12,
    "userId": 112233,
    "title": "learn TypeORM",
    "description": "hello,TypeORM",
    "views": 2,
    "isStar": false,
    "isFinish": 0,
    "createTime": 1545198789,
    "updateTime": 1545198789
}

參考鏈接:

http://typeorm.io/#/entities/column-types-for-mysql--mariadb

[END]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章