在Ts.ED项目中使用TypeORM进行数据库操作
TypeORM是一个优秀的关系型数据库ORM框架,而Ts.ED是一个基于TypeScript和Express的现代化Web框架。本文将详细介绍如何在Ts.ED项目中集成和使用TypeORM进行数据库操作。
TypeORM基础概念
在开始之前,我们先了解几个TypeORM的核心概念:
- DataSource:数据源,代表与数据库的连接
- Entity:实体类,映射数据库表结构
- Repository:仓库模式,提供对特定实体的CRUD操作
初始化TypeORM数据源
在Ts.ED中初始化TypeORM数据源有两种方式:
1. 使用Ts.ED CLI生成
Ts.ED CLI提供了便捷的命令行工具来生成TypeORM数据源:
tsed generate
选择TypeORM DataSource选项,然后按照向导完成配置。
2. 手动创建数据源
你也可以手动创建数据源配置:
import {registerProvider} from "@tsed/di";
import {DataSource} from "typeorm";
import {Logger} from "@tsed/logger";
import {User} from "../entities/User";
export const MYSQL_DATA_SOURCE = Symbol.for("MySqlDataSource");
export const MysqlDataSource = new DataSource({
type: "mysql",
entities: [User],
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test"
});
registerProvider<DataSource>({
provide: MYSQL_DATA_SOURCE,
type: "typeorm:datasource",
deps: [Logger],
async useAsyncFactory(logger: Logger) {
await MysqlDataSource.initialize();
logger.info("Connected with typeorm to database: MySQL");
return MysqlDataSource;
},
hooks: {
$onDestroy(dataSource) {
return dataSource.isInitialized && dataSource.close();
}
}
});
定义实体模型
在Ts.ED中定义TypeORM实体时,可以同时使用Ts.ED的装饰器来定义JSON Schema,这样同一个模型可以用于:
- 数据库表结构映射
- API请求/响应数据验证
- Swagger文档生成
import {Column, Entity, PrimaryGeneratedColumn} from "typeorm";
import {Required, MaxLength, MinLength, Email, Property} from "@tsed/schema";
@Entity()
export class User {
@PrimaryGeneratedColumn()
@Property()
id: number;
@Column()
@Required()
@MinLength(3)
@MaxLength(50)
firstName: string;
@Column()
@Required()
@MinLength(3)
@MaxLength(50)
lastName: string;
@Column()
@Required()
@Email()
email: string;
}
在控制器中使用TypeORM
定义好实体后,我们可以在控制器中直接使用:
import {BodyParams} from "@tsed/platform-params";
import {Get, Post} from "@tsed/schema";
import {Controller, Inject} from "@tsed/di";
import {MYSQL_DATA_SOURCE} from "../datasources/MysqlDataSource";
import {User} from "../entities/User";
@Controller("/users")
export class UsersCtrl {
@Inject(MYSQL_DATA_SOURCE)
protected mysqlDataSource: DataSource;
@Post("/")
create(@BodyParams() user: User): Promise<User> {
return this.mysqlDataSource.manager.save(User, user);
}
@Get("/")
getList(): Promise<User[]> {
return this.mysqlDataSource.manager.find(User);
}
}
创建自定义Repository
为了更好的组织代码,我们可以创建自定义Repository:
import {Injectable} from "@tsed/di";
import {DataSource} from "typeorm";
import {MySqlDataSource} from "../datasources/MySqlDataSource";
import {User} from "../entities/User";
export const UserRepository = MySqlDataSource.getRepository(User).extend({
findByName(firstName: string, lastName: string) {
return this.createQueryBuilder("user")
.where("user.firstName = :firstName", {firstName})
.andWhere("user.lastName = :lastName", {lastName})
.getMany();
}
});
export const USER_REPOSITORY = Symbol.for("UserRepository");
export type USER_REPOSITORY = typeof UserRepository;
registerProvider({
provide: USER_REPOSITORY,
useValue: UserRepository
});
然后在控制器中注入使用:
import {BodyParams} from "@tsed/platform-params";
import {Get, Post} from "@tsed/schema";
import {Controller, Inject} from "@tsed/di";
import {USER_REPOSITORY} from "../repositories/UserRepository";
import {User} from "../entities/User";
@Controller("/users")
export class UsersCtrl {
@Inject(USER_REPOSITORY)
protected repository: USER_REPOSITORY;
@Post("/")
create(@BodyParams() user: User): Promise<User> {
return this.repository.save(user);
}
@Get("/")
getList(): Promise<User[]> {
return this.repository.find();
}
@Get("/by-name")
getByName(): Promise<User[]> {
return this.repository.findByName("John", "Doe");
}
}
多数据源管理
如果你的应用需要连接多个数据库,可以创建多个DataSource实例,并通过服务统一管理:
import {Inject, Injectable, InjectorService} from "@tsed/di";
@Injectable()
export class DataSourcesService {
@Inject()
protected injector: InjectorService;
getDataSources() {
return this.injector.getAll("typeorm:datasource");
}
}
最佳实践
- 实体定义:始终在实体类上同时使用TypeORM和Ts.ED的装饰器,以获得完整的类型安全和文档支持
- 依赖注入:充分利用Ts.ED的DI系统来管理数据库连接和Repository
- 生命周期:注意DataSource的初始化和销毁,确保应用关闭时正确释放连接
- 事务管理:对于复杂操作,使用TypeORM的事务功能保证数据一致性
通过以上方式,你可以在Ts.ED项目中高效地使用TypeORM进行数据库操作,同时保持代码的整洁和可维护性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考