在Ts.ED项目中使用TypeORM进行数据库操作

在Ts.ED项目中使用TypeORM进行数据库操作

tsed :triangular_ruler: Ts.ED is a Node.js and TypeScript framework on top of Express to write your application with TypeScript (or ES6). It provides a lot of decorators and guideline to make your code more readable and less error-prone. ⭐️ Star to support our work! tsed 项目地址: https://gitcode.com/gh_mirrors/ts/tsed

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,这样同一个模型可以用于:

  1. 数据库表结构映射
  2. API请求/响应数据验证
  3. 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");
  }
}

最佳实践

  1. 实体定义:始终在实体类上同时使用TypeORM和Ts.ED的装饰器,以获得完整的类型安全和文档支持
  2. 依赖注入:充分利用Ts.ED的DI系统来管理数据库连接和Repository
  3. 生命周期:注意DataSource的初始化和销毁,确保应用关闭时正确释放连接
  4. 事务管理:对于复杂操作,使用TypeORM的事务功能保证数据一致性

通过以上方式,你可以在Ts.ED项目中高效地使用TypeORM进行数据库操作,同时保持代码的整洁和可维护性。

tsed :triangular_ruler: Ts.ED is a Node.js and TypeScript framework on top of Express to write your application with TypeScript (or ES6). It provides a lot of decorators and guideline to make your code more readable and less error-prone. ⭐️ Star to support our work! tsed 项目地址: https://gitcode.com/gh_mirrors/ts/tsed

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒋一南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值