从Sequelize迁移到TypeORM
设置数据源
在Sequelize中,您可以按照以下方式创建数据源:
const sequelize = new Sequelize("database", "username", "password", {
host: "localhost",
dialect: "mysql",
})
sequelize
.authenticate()
.then(() => {
console.log("数据源已成功初始化。")
})
.catch((err) => {
console.error("数据源初始化期间发生错误:", err)
})
在TypeORM中,您可以按照以下方式创建数据源:
import { DataSource } from "typeorm"
const dataSource = new DataSource({
type: "mysql",
host: "localhost",
username: "username",
password: "password",
})
dataSource
.initialize()
.then(() => {
console.log("数据源已成功初始化。")
})
.catch((err) => {
console.error("数据源初始化期间发生错误:", 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中,这些模型被称为实体(entities),您可以按照以下方式定义它们:
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;
使用模型
在Sequelize中,要创建和保存一个新的模型,您可以这样写:
const employee = await Employee.create({
name: "John Doe",
title: "senior engineer",
})
在TypeORM中,有几种创建和保存新模型的方式:
const employee = new Employee() // 您也可以使用构造函数参数
employee.name = "John Doe"
employee.title = "senior engineer"
await dataSource.getRepository(Employee).save(employee)
或者使用Active Record模式:
const employee = Employee.create({ name: "John Doe", title: "senior engineer" })
await employee.save()
如果您想从数据库加载现有实体并替换其某些属性,可以使用以下方法:
const employee = await Employee.preload({ id: 1, name: "John Doe" })
了解更多关于Active Record与Data Mapper和Repository API的信息。
在Sequelize中访问属性的方式如下:
console.log(employee.get("name"))
在TypeORM中,您只需简单地这样做:
console.log(employee.name)
在Sequelize中创建索引的方式是:
sequelize.define(
"user",
{},
{
indexes: [
{
unique: true,
fields: ["firstName", "lastName"],
},
],
},
)
在TypeORM中创建索引的方式是:
@Entity()
@Index(["firstName", "lastName"], { unique: true })
export class User {}
了解更多关于索引的信息。