在TypeORM中使用实体@Entity与字段@Column注解

2023-05-16

在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]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在TypeORM中使用实体@Entity与字段@Column注解 的相关文章

随机推荐