Typeorm 构建实体类

407 阅读7分钟

实体类

实体是一个映射到数据库表(或使用 MongoDB 时的集合)的类,用@Entity()来标记。实体由列和关系组成,每个实体必须有一个主列,例如:

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

@Entity('table_name')
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    isActive: boolean;
}

如果要为User实体使用替代表名,可以在@ Entity中指定:@Entity(“my_users”)

实体列

实体列映射到数据库表列,用@ Column@PrimaryColumn()等修饰符标记实体类的属性。

  • @ Column 一般数据库表列
  • @PrimaryColumn() 创建一个主列,它可以获取任何类型的任何值。
  • @PrimaryGeneratedColumn() 创建一个主列,该值将使用自动增量值自动生成。
  • @PrimaryGeneratedColumn("uuid") 创建一个主列,该值将使用uuid自动生成。
  • @CreateDateColumn 是一个特殊列,自动为实体插入日期。
  • @UpdateDateColumn 是一个特殊列,在每次调用实体管理器或存储库的save时,自动更新实体日期。
  • @VersionColumn 是一个特殊列,在每次调用实体管理器或存储库的save时自动增长实体版本(增量编号)。

列类型

列类型是特定于数据库类型的 - 这为数据库架构提供了更大的灵活性。 你可以将列类型指定为@ Column的第一个参数 或者在@Column的列选项中指定。如:

@Column("int")
@Column({ type: "int" })
@Column({ type: "int", length: 200 })

mysql/mariadb的列类型有:

inttinyintsmallintmediumintbigintfloatdoubledecdecimalnumericdatedatetimetimestamptimeyearcharvarcharnvarchartexttinytextmediumtextbloblongtexttinyblobmediumbloblongblobenumjsonbinarygeometrypointlinestringpolygonmultipointmultilinestringmultipolygongeometrycollection

列选项

列选项定义实体列的其他选项。 你可以在@ Column上指定列选项:

@Column({  
type: "varchar",  
length: 150,  
unique: true,  
// ...  
})
firstName: string;

当类属性名称和数据库表中的类名不一样时,可以通过name选项指定数据库表中的列名。如类名称是firstName,数据库表中是first_name。

以下是全部列选项:

  • type: ColumnType - 列类型。其中之一在上面.
  • name: string - 数据库表中的列名,默认是类属性名称。
  • length: number - 列类型的长度。 例如,如果要创建varchar(150)类型,请指定列类型和长度选项。
  • width: number - 列类型的显示范围。 仅用于MySQL integer types
  • onUpdate: string - ON UPDATE触发器。 仅用于 MySQL.
  • nullable: boolean - 在数据库中使列NULLNOT NULL。 默认情况下,列是nullable:false
  • update: boolean - 指示"save"操作是否更新列值。如果为false,则只能在第一次插入对象时编写该值。 默认值为"true"。
  • select: boolean - 定义在进行查询时是否默认隐藏此列。 设置为false时,列数据不会显示标准查询。 默认情况下,列是select:true
  • default: string - 添加数据库级列的DEFAULT值。
  • primary: boolean - 将列标记为主要列。 使用方式和@ PrimaryColumn相同。
  • unique: boolean - 将列标记为唯一列(创建唯一约束)。
  • comment: string - 数据库列备注,并非所有数据库类型都支持。
  • precision: number - 十进制(精确数字)列的精度(仅适用于十进制列),这是为值存储的最大位数。仅用于某些列类型。
  • scale: number - 十进制(精确数字)列的比例(仅适用于十进制列),表示小数点右侧的位数,且不得大于精度。 仅用于某些列类型。
  • zerofill: boolean - 将ZEROFILL属性设置为数字列。 仅在 MySQL 中使用。 如果是true,MySQL 会自动将UNSIGNED属性添加到此列。
  • unsigned: boolean - 将UNSIGNED属性设置为数字列。 仅在 MySQL 中使用。
  • charset: string - 定义列字符集。 并非所有数据库类型都支持。
  • collation: string - 定义列排序规则。
  • enum: string[]|AnyEnum - 在enum列类型中使用,以指定允许的枚举值列表。 你也可以指定数组或指定枚举类。
  • asExpression: string - 生成的列表达式。 仅在MySQL中使用。
  • generatedType: "VIRTUAL"|"STORED" - 生成的列类型。 仅在MySQL中使用。
  • hstoreType: "object"|"string" -返回HSTORE列类型。 以字符串或对象的形式返回值。 仅在Postgres>)中使用。
  • array: boolean - 用于可以是数组的 postgres 列类型(例如 int [])
  • transformer: { from(value: DatabaseType): EntityType, to(value: EntityType): DatabaseType } - 用于将任意类型EntityType的属性编组为数据库支持的类型DatabaseType

实体的使用

实体都必须在连接选项中注册,或者你可以指定包含所有实体的整个目录, 该目录下所有实体都将被加载:

import { createConnection, Connection } from "typeorm";  
import { User } from "./entity/User";  
  
const connection: Connection = await createConnection({  
type: "mysql",  
host: "localhost",  
port: 3306,  
username: "test",  
password: "test",  
database: "test",  
entities: [User]  // or entities: ["entity/*.js"]
});

连接选项

如果需要查看typeorm执行的sql,可以将logging选项设为true。

以下是全部连接选项:

  • type - 数据库类型。你必须指定要使用的数据库引擎。该值可以是"mysql","postgres","mariadb","sqlite", "better-sqlite3","cordova","nativescript","oracle","mssql","mongodb","sqljs","react-native"。此选项是必需的。
  • name - 连接名。 在使用 getConnection(name: string) 或 ConnectionManager.get(name: string)时候需要用到。不同连接的连接名称不能相同,它们都必须是唯一的。如果没有给出连接名称,那么它将被设置为"default"。
  • extra - 要传递给底层驱动程序的额外连接选项。如果要将额外设置传递给基础数据库驱动程序,请使用此配置。
  • entities - 要加载并用于此连接的实体。接受要加载的实体类和目录路径。目录支持 glob 模式。示例:entities: [Post, Category, "entity/*.js", "modules/**/entity/*.js"]。了解有关entities的更多信息。
  • subscribers - 要加载并用于此连接的订阅者。接受要加载的实体类和目录。目录支持 glob 模式。示例:subscribers: [PostSubscriber, AppSubscriber, "subscriber/*.js", "modules/**/subscriber/*.js"]。了解有关subscribers的更多信息。
  • entitySchemas - 要加载并用于此连接的实体架构。接受要加载的实体模式类和目录。目录支持 glob 模式。示例:entitySchemas: [PostSchema, CategorySchema, "entity-schema/*.json"。了解有关Entity Schemas的更多信息。
  • migrations - 要加载和用于此连接的迁移。接受要加载的迁移类和目录。目录支持 glob 模式。 示例: migrations: [FirstMigration, SecondMigration, "migration/*.js", "modules/**/migration/*.js"]. 了解有关 Migrations的更多信息。
  • logging - 指示是否启用日志记录。如果设置为true,则将启用查询和错误日志记录。你还可以指定要启用的不同类型的日志记录,例如["query", "error", "schema"]。详细了解Logging
  • logger - 记录器,用于日志的记录方式。可能的值是"advanced-console", "simple-console" 和 "file"。默认为"advanced-console"。你还可以指定实现Logger接口的记录器类。详细了解Logging
  • maxQueryExecutionTime - 如果查询执行时间超过此给定的最大执行时间(以毫秒为单位),则 logger 将记录此查询。
  • namingStrategy - 命名策略,用于命名数据 ​​ 库中的表和列。了解有关Naming strategies的更多信息。
  • entityPrefix - 给此数据库连接上的所有表(或集合)加的前缀。
  • dropSchema - 每次建立连接时删除架构。请注意此选项,不要在生产环境中使用它,否则将丢失所有生产数据。但是此选项在调试和开发期间非常有用。
  • synchronize - 指示是否在每次应用程序启动时自动创建数据库架构。 请注意此选项,不要在生产环境中使用它,否则将丢失所有生产数据。但是此选项在调试和开发期间非常有用。作为替代方案,你可以使用 CLI 运行 schema:sync 命令。请注意,对于 MongoDB 数据库,它不会创建模式,因为 MongoDB 是无模式的。相反,它只是通过创建索引来同步。
  • migrationsRun - 指示是否在每次启动应用程序时自动运行迁移。或者,您可以使用 CLI run migrations:run command
  • migrationsTableName - 数据库中将包含有关已执行迁移的信息的表的名称。默认情况下,此表名为"migrations"。
  • cache - 启用实体结果缓存。你还可以在此处配置缓存类型和其他缓存选项。阅读更多有关caching的信息。
  • cli.entitiesDir - CLI 默认情况下创建实体的目录。