返回

NestJS、Prisma 与 PostgreSQL 携手打造 RESTful API(第四部分)——玩转关系型数据库

后端

在 NestJS、Prisma 和 PostgreSQL 中征服关系型数据库

各位程序员小神仙们,欢迎来到我们的 NestJS、Prisma 和 PostgreSQL 构建 REST API 系列的第四章!在这个编程难题的奇妙世界中,我们将踏上征服关系型数据库的征程。

在这趟旅程中,你将掌握以下技能:

  • 定义一对一、一对多和多对多关系
  • 使用 NestJS Data Mapper ORM 查询和管理数据
  • 利用 Prisma 迁移工具创建和更新数据库模式

准备好了吗?那就系好安全带,让我们开始吧!

关系型数据库中的关系类型

在关系型数据库中,存在着三种基本的关系类型:

  • 一对一(One-to-One): 一个表中的一个记录最多只能与另一个表中的一个记录相关联。
  • 一对多(One-to-Many): 一个表中的一个记录最多可以与另一个表中的多个记录相关联。
  • 多对多(Many-to-Many): 一个表中的一个记录可以与另一个表中的多个记录相关联,反之亦然。

理解这些关系类型对于设计和管理数据库至关重要。

定义关系

现在,我们开始定义关系。让我们以「用户」(User)表和「个人资料」(Profile)表为例。

一对一关系

一个用户只能有一个个人资料,而一个个人资料只能属于一个用户。我们在 User 模型中定义这种关系:

@OneToOne(() => Profile)
profile: Profile;

在 Profile 模型中,我们也定义同样的关系:

@OneToOne(() => User)
user: User;

一对多关系

让我们以「订单」(Order)表和「订单项」(OrderItem)表为例。一个订单可以有多个订单项,但每个订单项只能属于一个订单。我们在 Order 模型中定义这种关系:

@OneToMany(() => OrderItem)
orderItems: OrderItem[];

在 OrderItem 模型中,我们定义关系的另一端:

@ManyToOne(() => Order)
order: Order;

多对多关系

最后,我们以「用户」(User)表和「角色」(Role)表为例。一个用户可以有多个角色,一个角色也可以有多个用户。我们在 User 模型中定义这种关系:

@ManyToMany(() => Role)
roles: Role[];

在 Role 模型中,我们定义关系的另一端:

@ManyToMany(() => User)
users: User[];

使用 ORM 查询和管理数据

定义了关系后,我们可以使用 ORM 来查询和管理数据。

查询数据

我们可以使用 NestJS Data Mapper ORM 提供的查询构建器来查询数据。例如,要查询所有具有「管理员」角色的用户:

const users = await userRepository.find({
  where: {
    roles: {
      some: {
        name: 'Admin',
      },
    },
  },
});

管理数据

我们还可以使用 ORM 来管理数据。例如,要创建一个新用户记录:

const user = new User();
user.name = 'John Doe';
user.email = 'john.doe@example.com';
await userRepository.save(user);

使用 Prisma 迁移工具

Prisma 提供了一个命令行工具,用于创建和更新数据库模式。

创建数据库模式

使用以下命令创建数据库模式:

npx prisma migrate dev

更新数据库模式

使用以下命令更新数据库模式:

npx prisma migrate deploy

总结

在这个章节中,我们探索了 NestJS、Prisma 和 PostgreSQL 中的关系型数据库处理。我们学会了定义关系、使用 ORM 查询和管理数据,以及利用 Prisma 迁移工具创建和更新数据库模式。

在下一章中,我们将深入探究 NestJS 的身份验证和授权机制。敬请期待!

常见问题解答

  1. 如何在 NestJS 中定义自定义关系?
    您可以使用 @Relation() 装饰器来定义自定义关系。

  2. 如何使用 NestJS Data Mapper ORM 进行复杂查询?
    您可以使用 QueryBuilder 来构建复杂查询。

  3. Prisma 迁移如何处理数据迁移?
    Prisma 迁移使用增量模式来处理数据迁移,确保安全可靠。

  4. NestJS 中的 ORM 与传统 ORM 有什么区别?
    NestJS Data Mapper ORM 专为 NestJS 框架量身定制,提供无缝集成。

  5. 使用关系型数据库的优点有哪些?
    关系型数据库提供数据完整性、事务支持和高效的查询。