TypeORM 列装饰器完整总结

在 TypeORM 中,除了 @PrimaryGeneratedColumn 自增主键外,还有以下几种列装饰器:

主键相关装饰器

1. @PrimaryColumn()

typescript 复制代码
@PrimaryColumn()
id: number;

// 或指定类型
@PrimaryColumn('uuid')
id: string;

2. @PrimaryGeneratedColumn()

typescript 复制代码
// 自增主键(默认)
@PrimaryGeneratedColumn()
id: number;

// UUID主键
@PrimaryGeneratedColumn('uuid')
id: string;

// 自定义策略
@PrimaryGeneratedColumn('increment')
id: number;

普通列装饰器

3. @Column() - 基础列

typescript 复制代码
// 基本用法
@Column()
name: string;

// 带选项
@Column({ 
  type: 'varchar', 
  length: 100, 
  nullable: false,
  unique: true,
  default: 'default value'
})
title: string;

// 数字类型
@Column({ type: 'int', unsigned: true })
age: number;

// 文本类型
@Column('text')
description: string;

// 布尔类型
@Column({ type: 'boolean', default: false })
isActive: boolean;

// 日期时间
@Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
createdAt: Date;

// JSON类型
@Column('json')
metadata: any;

// 枚举类型
@Column({ type: 'enum', enum: ['admin', 'user', 'guest'] })
role: string;

特殊列装饰器

4. @CreateDateColumn()

typescript 复制代码
@CreateDateColumn()
createdAt: Date;  // 自动设置创建时间

5. @UpdateDateColumn()

typescript 复制代码
@UpdateDateColumn()
updatedAt: Date;  // 自动更新修改时间

6. @DeleteDateColumn()

typescript 复制代码
@DeleteDateColumn()
deletedAt: Date;  // 软删除时间戳

7. @VersionColumn()

typescript 复制代码
@VersionColumn()
version: number;  // 乐观锁版本号

8. @Generated()

typescript 复制代码
@Generated('uuid')
uuid: string;

@Generated('increment')
sequence: number;

完整示例

让我创建一个更完整的实体示例来展示这些装饰器:

TypeORM 列装饰器完整总结:

🔑 主键装饰器

  • @PrimaryColumn() - 手动指定主键
  • @PrimaryGeneratedColumn() - 自动生成主键(自增/UUID)

📝 普通列装饰器

  • @Column() - 基础列装饰器,支持各种数据类型

⏰ 时间相关装饰器

  • @CreateDateColumn() - 自动设置创建时间
  • @UpdateDateColumn() - 自动更新修改时间
  • @DeleteDateColumn() - 软删除时间戳

🔢 特殊功能装饰器

  • @VersionColumn() - 乐观锁版本号
  • @Generated() - 自动生成值(UUID/递增序列)

📊 常用数据类型示例

typescript 复制代码
// 字符串类型
@Column('varchar', { length: 100 })
@Column('text')
@Column('char', { length: 10 })

// 数字类型
@Column('int')
@Column('bigint')
@Column('decimal', { precision: 10, scale: 2 })
@Column('float')
@Column('double')

// 日期时间类型
@Column('date')
@Column('time')
@Column('datetime')
@Column('timestamp')

// 其他类型
@Column('boolean')
@Column('json')
@Column('enum', { enum: MyEnum })
@Column('simple-array')  // 数组类型

🔧 常用选项参数

typescript 复制代码
@Column({
  type: 'varchar',           // 数据类型
  length: 255,              // 长度
  nullable: true,           // 可空
  unique: true,             // 唯一约束
  default: 'default value', // 默认值
  comment: '字段说明',       // 注释
  unsigned: true,           // 无符号(数字类型)
  precision: 10,            // 精度
  scale: 2,                 // 小数位数
})

user-complete.entity.ts 文件展示了所有这些装饰器的实际用法,你可以参考这个文件来了解每种类型的具体应用场景。

js 复制代码
 // user-complete.entity.ts
import { 
  Entity, 
  Column, 
  PrimaryGeneratedColumn,
  PrimaryColumn,
  CreateDateColumn,
  UpdateDateColumn,
  DeleteDateColumn,
  VersionColumn,
  Generated
} from 'typeorm';

// 用户角色枚举
export enum UserRole {
  ADMIN = 'admin',
  USER = 'user',
  GUEST = 'guest'
}

// 用户状态枚举
export enum UserStatus {
  ACTIVE = 'active',
  INACTIVE = 'inactive',
  SUSPENDED = 'suspended'
}

@Entity('users_complete')
export class UserComplete {
  // 1. 自增主键
  @PrimaryGeneratedColumn()
  id: number;

  // 2. UUID主键(如果不想用自增主键)
  // @PrimaryGeneratedColumn('uuid')
  // uuid: string;

  // 3. 手动指定主键
  // @PrimaryColumn()
  // customId: string;

  // 4. 基础字符串列
  @Column({ 
    type: 'varchar', 
    length: 100, 
    nullable: false,
    comment: '用户姓名'
  })
  name: string;

  // 5. 唯一邮箱
  @Column({ 
    type: 'varchar', 
    length: 255, 
    unique: true,
    comment: '用户邮箱'
  })
  email: string;

  // 6. 可空的手机号
  @Column({ 
    type: 'varchar', 
    length: 20, 
    nullable: true,
    comment: '手机号码'
  })
  phone: string;

  // 7. 整数年龄
  @Column({ 
    type: 'int', 
    unsigned: true,
    comment: '用户年龄'
  })
  age: number;

  // 8. 小数类型(如余额)
  @Column({ 
    type: 'decimal', 
    precision: 10, 
    scale: 2,
    default: 0.00,
    comment: '账户余额'
  })
  balance: number;

  // 9. 布尔类型
  @Column({ 
    type: 'boolean', 
    default: true,
    comment: '是否激活'
  })
  isActive: boolean;

  // 10. 枚举类型 - 用户角色
  @Column({ 
    type: 'enum', 
    enum: UserRole,
    default: UserRole.USER,
    comment: '用户角色'
  })
  role: UserRole;

  // 11. 枚举类型 - 用户状态
  @Column({ 
    type: 'enum', 
    enum: UserStatus,
    default: UserStatus.ACTIVE,
    comment: '用户状态'
  })
  status: UserStatus;

  // 12. 文本类型
  @Column({ 
    type: 'text', 
    nullable: true,
    comment: '用户简介'
  })
  bio: string;

  // 13. JSON类型
  @Column({ 
    type: 'json',
    nullable: true,
    comment: '用户设置'
  })
  settings: any;

  // 14. 日期类型
  @Column({ 
    type: 'date',
    nullable: true,
    comment: '出生日期'
  })
  birthDate: Date;

  // 15. 时间类型
  @Column({ 
    type: 'time',
    nullable: true,
    comment: '偏好时间'
  })
  preferredTime: string;

  // 16. 自动生成的UUID字段
  @Generated('uuid')
  @Column()
  uuid: string;

  // 17. 自动递增序列号
  @Generated('increment')
  @Column()
  sequence: number;

  // 18. 自动创建时间
  @CreateDateColumn({
    comment: '创建时间'
  })
  createdAt: Date;

  // 19. 自动更新时间
  @UpdateDateColumn({
    comment: '更新时间'
  })
  updatedAt: Date;

  // 20. 软删除时间(用于软删除)
  @DeleteDateColumn({
    comment: '删除时间'
  })
  deletedAt: Date;

  // 21. 乐观锁版本号
  @VersionColumn({
    comment: '版本号'
  })
  version: number;

  // 22. 带默认值的列
  @Column({ 
    type: 'varchar',
    length: 50,
    default: 'zh-CN',
    comment: '用户语言偏好'
  })
  language: string;

  // 23. 数组类型(PostgreSQL支持)
  // @Column('simple-array')
  // tags: string[];

  // 24. 复杂数组类型(PostgreSQL支持)
  // @Column('simple-json')
  // profile: { nickname: string; avatar: string; };
}
相关推荐
草莓熊Lotso3 分钟前
C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战
前端·c++·python·selenium
Olrookie16 分钟前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
LucianaiB32 分钟前
招聘可以AI面试,那么我制作了一个AI面试教练不过分吧
后端
533_1 小时前
[vue] dayjs 显示实时时间
前端·javascript·vue.js
无奈何杨1 小时前
CoolGuard更新,ip2region升级、名单增加过期时间
后端
故事与他6451 小时前
XSS_and_Mysql_file靶场攻略
前端·学习方法·xss
莫的感情2 小时前
下载按钮点击一次却下载两个文件问题
前端
一个很帅的帅哥2 小时前
JavaScript事件循环
开发语言·前端·javascript
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 自定义静态资源目录 笔记31
spring boot·笔记·后端·spring
Anthony_49262 小时前
逻辑清晰地梳理Golang Context
后端·go