Миграция с Sequelize на TypeORM
Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
Настройка источника данных
В Sequelize источник данных создаётся так:
const sequelize = new Sequelize("database", "username", "password", {
host: "localhost",
dialect: "mysql",
})
sequelize
.authenticate()
.then(() => {
console.log("Data Source has been initialized successfully.")
})
.catch((err) => {
console.error("Error during Data Source initialization:", err)
})
В TypeORM источник данных создаётся следующим образом:
import { DataSource } from "typeorm"
const dataSource = new DataSource({
type: "mysql",
host: "localhost",
username: "username",
password: "password",
})
dataSource
.initialize()
.then(() => {
console.log("Data Source has been initialized successfully.")
})
.catch((err) => {
console.error("Error during Data Source initialization:", err)
})
Затем экземпляр dataSource можно использовать из любого места в приложении.
Подробнее об Источнике данных
Синхронизация схемы
В Sequelize синхронизация схемы выполняется так:
Project.sync({ force: true })
Task.sync({ force: true })
В TypeORM достаточно добавить synchronize: true в настройки источника данных:
const dataSource = new DataSource({
type: "mysql",
host: "localhost",
username: "username",
password: "password",
synchronize: true,
})
Создание моделей
Вот как модели определяются в Sequelize:
module.exports = function (sequelize, DataTypes) {
const Project = sequelize.define("project", {
title: DataTypes.STRING,
description: DataTypes.TEXT,
})
return Project
}
module.exports = function (sequelize, DataTypes) {
const Task = sequelize.define("task", {
title: DataTypes.STRING,
description: DataTypes.TEXT,
deadline: DataTypes.DATE,
})
return Task
}
В TypeORM модели называются сущностями и определяются так:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity()
export class Project {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column()
description: string
}
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
@Entity()
export class Task {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
@Column("text")
description: string
@Column()
deadline: Date
}
Настоятельно рекомендуется определять каждый класс сущности в отдельном файле. TypeORM позволяет использовать ваши классы как модели базы данных и предоставляет декларативный способ определения того, какая часть модели станет частью таблицы базы данных. Возможности TypeScript дают подсказки типов и другие полезные функции для работы с классами.
Подробнее о Сущностях и столбцах
Другие настройки моделей
Следующее в Sequelize:
flag: { type: Sequelize.BOOLEAN, allowNull: true, defaultValue: true },
В TypeORM реализуется так:
@Column({ nullable: true, default: true })
flag: boolean;
В Sequelize:
flag: { type: Sequelize.DATE, defaultValue: Sequelize.NOW }
В TypeORM записывается так:
@Column({ default: () => "NOW()" })
myDate: Date;
В Sequelize:
someUnique: { type: Sequelize.STRING, unique: true },
В TypeORM реализуется так:
@Column({ unique: true })
someUnique: string;
В Sequelize:
fieldWithUnderscores: { type: Sequelize.STRING, field: "field_with_underscores" },
Соответствует в TypeORM:
@Column({ name: "field_with_underscores" })
fieldWithUnderscores: string;
В Sequelize:
incrementMe: { type: Sequelize.INTEGER, autoIncrement: true },
В TypeORM реализуется так:
@Column()
@Generated()
incrementMe: number;
В Sequelize:
identifier: { type: Sequelize.STRING, primaryKey: true },
В TypeORM реализуется так:
@Column({ primary: true })
identifier: string;
Для создания столбцов типа createDate и updateDate определите в сущности два столбца (с любыми именами):
@CreateDateColumn();
createDate: Date;
@UpdateDateColumn();
updateDate: Date;