Справочник декораторов
Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
Декораторы сущностей
@Entity
Помечает ваш класс как сущность. Сущность — это класс, который преобразуется в таблицу базы данных. Имя таблицы можно указать непосредственно в сущности:
@Entity("users")
export class User {}
Этот код создаст таблицу базы данных с именем "users".
Также можно указать дополнительные параметры сущности:
-
name- имя таблицы. Если не указано, генерируется из имени класса сущности. -
database- имя базы данных на выбранном сервере БД. -
schema- имя схемы. -
engine- д вижок базы данных, устанавливаемый при создании таблицы (работает только в некоторых БД). -
synchronize- сущности сfalseпропускаются при обновлении схемы. -
orderBy- задаёт порядок сортировки по умолчанию для операцийfindиQueryBuilder.
Пример:
@Entity({
name: "users",
engine: "MyISAM",
database: "example_dev",
schema: "schema_with_best_tables",
synchronize: false,
orderBy: {
name: "ASC",
id: "DESC",
},
})
export class User {}
Подробнее о сущностях.
@ViewEntity
Сущность-представление — это класс, отображаемый на представление базы данных.
@ViewEntity() принимает следующие параметры:
-
name- имя представления. Если не указано, генерируется из имени класса сущности. -
database- имя базы данных на выбранном сервере БД. -
schema- имя схемы. -
expression- определение представления. Обязательный параметр.
expression может быть строкой с правильно экранированными столбцами и таблицами (для примера — Postgres):
@ViewEntity({
expression: `
SELECT "post"."id" "id", "post"."name" AS "name", "category"."name" AS "categoryName"
FROM "post" "post"
LEFT JOIN "category" "category" ON "post"."categoryId" = "category"."id"
`,
})
export class PostCategory {}
или экземпляром QueryBuilder
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.select("post.id", "id")
.addSelect("post.name", "name")
.addSelect("category.name", "categoryName")
.from(Post, "post")
.leftJoin(Category, "category", "category.id = post.categoryId"),
})
export class PostCategory {}
Примечание: привязка параметров не поддерживается из-за ограничений драйверов. Используйте литеральные параметры.
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.select("post.id", "id")
.addSelect("post.name", "name")
.addSelect("category.name", "categoryName")
.from(Post, "post")
.leftJoin(Category, "category", "category.id = post.categoryId")
.where("category.name = :name", { name: "Cars" }) // <-- this is wrong
.where("category.name = 'Cars'"), // <-- and this is right
})
export class PostCategory {}
Подробнее о сущностях-представлениях.
Декораторы столбцов
@Column
Помечает свойство сущности как столбец таблицы. Пример:
@Entity("users")
export class User {
@Column({ primary: true })
id: number
@Column({ type: "varchar", length: 200, unique: true })
firstName: string
@Column({ nullable: true })
lastName: string
@Column({ default: false })
isActive: boolean
}
@Column поддерживает несколько параметров:
-
type: ColumnType- тип столбца. Один из поддерживаемых типов. -
name: string- имя столбца в таблице базы данных. По умолчанию генерируется из имени свойства. Можно переопределить. -
length: string|number- длина типа столбца. Например, для создания типаvarchar(150)укажите тип и длину. -
width: number- ширина отображения для целочисленных типов. Только для MySQL. Устарело в новых версиях MySQL, будет удалено из TypeORM. -
onUpdate: string— ТриггерON UPDATE. Используется только в MySQL. -
nullable: boolean- определяет, может ли столбец бытьNULLили всегдаNOT NULL. По умолчаниюnullable: false. -
update: boolean- разрешает ли обновление значения при операции "save". Если false, значение можно установить только при вставке. По умолчаниюtrue. -
insert: boolean- Указывает, устанавливается ли значение столбца при первой вставке объекта. По умолчаниюtrue. -
select: boolean- Определяет, скрывать ли этот столбец по умолчанию при запросах. Приfalseданные столбца не будут возвращаться стандартным запросом. По умолчаниюselect: true. -
default: string- Задаёт значениеDEFAULTна уровне базы данных. -
primary: boolean- помечает столбец как первичный ключ. Эквивалентно@PrimaryColumn. -
unique: boolean- помечает столбец как уникальный (создаёт ограничение UNIQUE). По умолчанию false. -
comment: string- Комментарий к столбцу в БД. Поддерживается не всеми типами баз данных. -
precision: number- Точность для десятичных столбцо в (только для exact numeric), определяющая максимальное количество хранимых цифр. Применяется в некоторых типах столбцов. -
scale: number- масштаб для десятичных столбцов (только для exact numeric), определяющий количество цифр после запятой (не может превышать precision). Применяется в некоторых типах столбцов. -
zerofill: boolean- добавляет атрибутZEROFILLдля числовых столбцов. Только для MySQL. Приtrueавтоматически добавляетсяUNSIGNED. Устарело в новых версиях MySQL, будет удалено из TypeORM. Используйте строковые столбцы и функциюLPAD. -
unsigned: boolean- Добавляет атрибутUNSIGNEDк числовому столбцу. Только для MySQL. -
charset: string- Задаёт кодировку столбца. Поддерживается не всеми типами БД. -
collation: string- Задаёт правила сортировки для столбца. -
enum: string[]|AnyEnum- для типаenumзадаёт допустимые значения. Можно указать массив строк или enum-класс. -
enumName: string- имя генерируемого enum-типа. Если не указано, TypeORM сгенерирует имя из сущности и столбца. Обязательно при использовании одного enum в разных таблицах. -
primaryKeyConstraintName: string- имя ограничения первичного ключа. По умолчанию генерируется из имён таблицы и столбцов. -
asExpression: string- выражение для генерируемого столбца. Только для MySQL и Postgres. -
generatedType: "VIRTUAL"|"STORED"- тип генерируемого столбца. Только для MySQL и Postgres (только "STORED"). -
hstoreType: "object"|"string"- Тип возвращаемого значения дляHSTORE. Возвращает значение как строку или объект. Только для Postgres. -
array: boolean- для типов столбцов Postgres и CockroachDB, которые могут быть массивами (например, int[]). -
transformer: ValueTransformer|ValueTransformer[]- Задаёт трансформер значений (или массив трансформеров), преобразующий данные при чтении/записи в БД. Для массива трансформеры применяются в прямом порядке (от значения сущности к БД) и обратном (от БД к сущности). -
spatialFeatureType: string- Опциональный тип пространственного объекта (Point,Polygon,LineString,Geometry) для ограничения пространственного столбца. По умолчанию ведёт себя какGeometry. Поддерживается только в PostgreSQL и CockroachDB. -
srid: number- Опциональный идентификатор пространственной привязки для пространственного столбца. По умолчанию0. Координаты WGS84 (широта/долгота) соответствуют EPSG 4326. Поддерживается только в PostgreSQL и CockroachDB.
Подробнее о колонках сущностей.
@PrimaryColumn
Помечает свойство сущности как первичный столбец таблицы.
Аналогичен декоратору @Column, но устанавливает опцию primary в значение true.
Пример:
@Entity()
export class User {
@PrimaryColumn()
id: number
}
@PrimaryColumn() поддерживает кастомное имя ограничения первичного ключа:
@Entity()
export class User {
@PrimaryColumn({ primaryKeyConstraintName: "pk_user_id" })
id: number
}
Примечание: при использовании
primaryKeyConstraintNameс несколькими первичными ключами имя ограничения должно быть одинаковым для всех первичных столбцов.
Подробнее о колонках сущностей.
@PrimaryGeneratedColumn
Помечает свойство сущности как автоматически генерируемый первичный столбец. Создаваемый столбец является первичным, а его значение генерируется автоматически. Пример:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
}
@PrimaryGeneratedColumn() поддерживает кастомное имя ограничения первичного ключа:
@Entity()
export class User {
@PrimaryGeneratedColumn({ primaryKeyConstraintName: "pk_user_id" })
id: number
}
Доступны четыре стратегии генерации:
-
increment- использует AUTO_INCREMENT/SERIAL/SEQUENCE (зависит от БД) для генерации инкрементных чисел. -
identity- только для PostgreSQL 10+. Версии Postgres выше 10 поддерживают SQL-совместимый столбец IDENTITY. Когда стратегия генерации помечена какidentity, столбец будет создан черезGENERATED [ALWAYS|BY DEFAULT] AS IDENTITY. -
uuid- генерирует уникальные строкиuuid. -
rowid- только для CockroachDB. Генерирует 64-битное целое черезunique_rowid()на основе временной метки и ID узла приINSERT/UPSERT.Примечание: свойства со стратегией
rowidдолжны иметь типstring.
Стратегия по умолчанию - increment. Для изменения передайте нужную стратегию первым аргументом декоратора:
@Entity()
export class User {
@PrimaryGeneratedColumn("uuid")
id: string
}
Подробнее о колонках сущностей.
@ObjectIdColumn
Помечает свойство сущности как ObjectId. Этот декоратор используется только в MongoDB. Каждая сущность в MongoDB должна содержать столбец ObjectId. Пример:
@Entity()
export class User {
@ObjectIdColumn()
id: ObjectId
}
Подробнее о MongoDB.
@CreateDateColumn
Специальный столбец, автоматически устанавливающийся в время создания сущности. Не требует ручного заполнения - значение устанавливается автоматически. Пример:
@Entity()
export class User {
@CreateDateColumn()
createdDate: Date
}
@UpdateDateColumn
Специальный столбец, автоматически обновляющийся до времени изменения сущности при каждом вызове save из менеджера сущностей или репозитория. Не требует ру чного заполнения - значение обновляется автоматически.
Этот столбец также автоматически обновляется во время операций upsert при обновлении из-за конфликта.
@Entity()
export class User {
@UpdateDateColumn()
updatedDate: Date
}
@DeleteDateColumn
Специальный столбец, который автоматически устанавливается во время удаления сущности при каждом вызове soft-delete в менеджере или репозитории. Вам не нужно задавать значение для этого столбца — он устанавливается автоматически.
Функция мягкого удаления в TypeORM использует глобальные скоупы для выборки только "неудалённых" сущностей из базы данных.
Если установлен @DeleteDateColumn, стандартным скоупом будут "неудалённые" записи.
@Entity()
export class User {
@DeleteDateColumn()
deletedDate: Date
}
@VersionColumn
Специальный столбец, который автоматически устанавливается как версия сущности (инкрементное число) при каждом вызове save в менеджере или репозитории. Вам не нужно задавать значение для этого столбца — он устанавливается автоматически.
Этот столбец также автоматически обновляется во время операций upsert при обновлении из-за конфликта.
@Entity()
export class User {
@VersionColumn()
version: number
}
@Generated
Помечает столбец как генерируемое значение. Например:
@Entity()
export class User {
@Column()
@Generated("uuid")
uuid: string
}
Значение генерируется только один раз перед вставкой сущности в базу данных.
@VirtualColumn
Специальный столбец, который никогда не сохраняется в базе данных и действует как свойство только для чтения. При каждом вызове find или findOne в менеджере сущностей значение пересчитывается на основе функции запроса, указанной в декораторе VirtualColumn. Аргумент alias, передаваемый в запрос, ссылается на псевдоним сущности в сгенерированном запросе.
@Entity({ name: "companies", alias: "COMP" })
export class Company extends BaseEntity {
@PrimaryColumn("varchar", { length: 50 })
name: string
@VirtualColumn({
query: (alias) =>
`SELECT COUNT("name") FROM "employees" WHERE "companyName" = ${alias}.name`,
})
totalEmployeesCount: number
@OneToMany((type) => Employee, (employee) => employee.company)
employees: Employee[]
}
@Entity({ name: "employees" })
export class Employee extends BaseEntity {
@PrimaryColumn("varchar", { length: 50 })
name: string
@ManyToOne((type) => Company, (company) => company.employees)
company: Company
}
Декораторы отношений
@OneToOne
Отношение "один-к-одному" — когда A содержит только один экземпляр B, а B содержит только один экземпляр A. Например, сущности User и Profile. Пользователь может иметь только один профиль, а один профиль принадлежит только одному пользователю. Пример:
import { Entity, OneToOne, JoinColumn } from "typeorm"
import { Profile } from "./Profile"
@Entity()
export class User {
@OneToOne((type) => Profile, (profile) => profile.user)
@JoinColumn()
profile: Profile
}
Подробнее об отношениях один-к-одному.
@ManyToOne
Отношение "многие-к-одному" / "один-ко-многим" — когда A содержит несколько экземпляров B, но B содержит только один экземпляр A. Например, сущности User и Photo. Пользователь может иметь несколько фотографий, но каждая фотография принадлежит только одному пользователю. Пример:
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm"
import { User } from "./User"
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number
@Column()
url: string
@ManyToOne((type) => User, (user) => user.photos)
user: User
}
Подробнее об отношениях многие-к-одному / один-ко-многим.
@OneToMany
Отношение "многие-к-одному" / "один-ко-многим" — когда A содержит несколько экземпляров B, но B содержит только один экземпляр A. Например, сущности User и Photo. Пользователь может иметь несколько фотографий, но каждая фотография принадлежит только одному пользователю. Пример:
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm"
import { Photo } from "./Photo"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
@OneToMany((type) => Photo, (photo) => photo.user)
photos: Photo[]
}
Подробнее об отношениях многие-к-одному / один-ко-многим.