Часто задаваемые вопросы
Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
Как обновить схему базы данных?
Одна из основных задач TypeORM — поддерживать синхронизацию таблиц базы данных с вашими сущностями. Для этого существует два подхода:
-
Используйте
synchronize: trueв настройках источника данных:import { DataSource } from "typeorm"
const myDataSource = new DataSource({
// ...
synchronize: true,
})Эта опция автоматически синхронизирует таблицы базы данных с указанными сущностями при каждом запуске кода. Идеально подходит для разработки, но в продакшене её рекомендуется отключать.
-
Используйте CLI-инструменты для ручной синхронизации схемы через командную строку:
typeorm schema:syncЭта команда выполняет синхронизацию схемы.
Синхронизация схемы работает очень быстро. Если вы планируете отключать опцию synchronize в разработке из-за проблем с производительностью — сначала проверьте её скорость.
Как изменить имя столбца в базе данных?
По умолчанию имена столбцов генерируются из названий свойств сущности. Для изменения укажите опцию name в декораторе столбца:
@Column({ name: "is_active" })
isActive: boolean;
Как установить значение по умолчанию в виде функции (например, NOW())?
Опция default поддерживает функции. Если передать функцию, возвращающую строку, она будет использована как значение по умолчанию без экранирования. Пример:
@Column({ default: () => "NOW()" })
date: Date;
Как реализовать валидацию?
Валидация не входит в TypeORM, так как это отдельный процесс, не связанный напрямую с его задачами. Для валидации используйте class-validator — он идеально интегрируется с TypeORM.
Что означает "сторона владельца" в отношениях и зачем нужны @JoinColumn/@JoinTable?
Рассмотрим отношение one-to-one на примере сущностей User и Photo:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
@OneToOne()
photo: Photo
}
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number
@Column()
url: string
@OneToOne()
user: User
}
В этом примере отсутствует @JoinColumn, что неверно.
Поч ему? Потому что для создания реальной связи необходимо добавить столбец в базу данных: userId в таблице photo или photoId в user.
Но какой столбец следует создать - userId или photoId?
TypeORM не может принять решение за вас.
Чтобы принять решение, необходимо использовать @JoinColumn на одной из сторон.
@JoinColumnвPhoto→ создаст столбецuserIdв таблицеphoto@JoinColumnвUser→ создаст столбецphotoIdв таблицеuser
Сторона с @JoinColumn называется "владельцем отношения" (owner side), противоположная сторона отношения, без @JoinColumn, — "инверсной (не владеющей) стороной" (inverse/non-owner side).
Аналогично для отношений @ManyToMany: @JoinTable указывает на владеющую сторону.
В отношениях @ManyToOne/@OneToMany декоратор @JoinColumn не обязателен — таблица с @ManyToOne автоматически получает связующий столбец.
Декораторы @JoinColumn и @JoinTable также позволяют настраивать дополнительные параметры: имя связующего столбца, название junction-таблицы и т.д.