返回

Nest 集成 TypeORM 深度教程:从新手到进阶的进阶之旅

后端

TypeORM:将 NestJS 应用提升到一个新层次的 ORM 工具

在构建数据驱动的应用程序时,管理与数据库的交互至关重要。TypeORM 是一个功能强大的对象关系映射(ORM)工具,可以帮助 NestJS 开发人员轻松实现这一目标。

什么是 TypeORM?

TypeORM 是一个开源的 TypeScript ORM,它提供了一层抽象,允许您将 JavaScript 对象映射到数据库表。这意味着您可以用 JavaScript 对象表示和操纵数据库中的数据,从而简化了数据管理任务。

为什么要使用 TypeORM?

使用 TypeORM 有很多好处,包括:

  • 减少样板代码: TypeORM 消除了编写用于与数据库交互的样板代码的需要,例如 SQL 查询和更新语句。
  • 对象关系映射: 它允许您使用 JavaScript 对象表示和操纵数据库中的数据,从而提高了代码的可读性和可维护性。
  • 类型安全: TypeORM 使用 TypeScript,这提供了类型安全,防止出现常见的数据库错误。
  • 多种数据库支持: TypeORM 支持多种数据库,包括 MySQL、PostgreSQL 和 SQLite,为您提供了灵活性。

在 NestJS 中集成 TypeORM

在 NestJS 项目中集成 TypeORM 非常简单:

  1. 安装 TypeORM: 使用以下命令安装 TypeORM:
npm install typeorm
  1. 配置 TypeORM: 创建一个名为 ormconfig.json 的文件,并添加以下内容:
{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "password",
  "database": "test",
  "entities": [
    "src/entity/**/*.ts"
  ],
  "synchronize": true
}
  1. 创建实体: 使用 TypeORM CLI 创建实体,它是表示数据库表的 JavaScript 类:
typeorm generate entity --name User
  1. 使用 TypeORM: 在 NestJS 服务中,使用 @Entity() 装饰器来装饰实体类,并在方法中使用 @InjectRepository() 装饰器来注入实体仓库:
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;
}

@Injectable()
export class UserService {
  constructor(@InjectRepository(User) private userRepository: Repository<User>) {}

  async findAll(): Promise<User[]> {
    return await this.userRepository.find();
  }
}

常见问题解答

1. 为什么选择 TypeORM?

TypeORM 是一个功能强大、易于使用、类型安全的 ORM,支持多种数据库。它消除了样板代码的需要,并提供了对象关系映射,简化了数据管理任务。

2. 如何安装 TypeORM?

使用以下命令安装 TypeORM:

npm install typeorm

3. 如何配置 TypeORM?

创建一个名为 ormconfig.json 的文件,并添加以下内容:

{
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "password",
  "database": "test",
  "entities": [
    "src/entity/**/*.ts"
  ],
  "synchronize": true
}

4. 如何创建实体?

使用 TypeORM CLI 创建实体:

typeorm generate entity --name User

5. 如何使用 TypeORM?

在 NestJS 服务中,使用 @Entity() 装饰器来装饰实体类,并在方法中使用 @InjectRepository() 装饰器来注入实体仓库:

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;
}

@Injectable()
export class UserService {
  constructor(@InjectRepository(User) private userRepository: Repository<User>) {}

  async findAll(): Promise<User[]> {
    return await this.userRepository.find();
  }
}