# Prisma 是什么?

Prisma 是一个开源的下一代 ORM(对象关系映射器),它在 Node.js 和 TypeScript 生态系统中非常流行。它不仅能帮助开发者以更简单、更安全的方式构建数据访问层,而且还提供了强大的类型安全特性,使得在 TypeScript 环境中尤其得心应手。

Prisma 主要由以下几个部分组成:

  1. Prisma Client:这是一个自动生成的数据库客户端库,可以让你以类型安全的方式执行数据库查询。这意味着它能提供编译时的错误检查和智能代码补全,极大提高了开发效率和代码的可靠性。
  2. Prisma Schema:这是一个用于定义你的应用程序数据模型和配置如数据库连接等的文件( schema.prisma )。这个模式文件是 Prisma 工作流的核心,它会用来生成 Prisma Client,并且可以直接用于数据库迁移。
  3. Prisma Migrate:这是 Prisma 的数据库迁移工具,可以帮助你以版本控制的方式安全地修改数据库架构。使用 Prisma Migrate,你可以通过修改 schema.prisma 文件并执行迁移命令来更新数据库架构。

Prisma 支持主流的数据库系统,如 PostgreSQL、MySQL、SQLite 和 SQL Server 等。它的设计使得开发者能够以少写代码的方式实现更多的功能,同时保持代码的清晰和可维护性。

# 和 TypeORM 的异同点

# 基本分析

TypeORM 是一个传统的 ORM 框架,也就是把表映射到 entity 类,把表的关联映射成 entity 类的属性关联,完成 entity 和表的映射之后,你只要调用 userRepository 和 postRepository 的 find、delete、save 等 api,typeorm 会自动生成对应的 sql 语句并执行。

这就是 Object Relational Mapping,也就是对象和关系型数据库的映射的含义。

而 Prisma 不是这样的, 它没有 entity 类的存在

那映射什么呢?

Prisma 创造了一种 DSL(Domain Specific Language,领域特定语言),以 .prisma 为命名后缀:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

model User {
  id   Int    @id @default(autoincrement())
  name String
}

它是把表映射成了 DSL 里的 model,然后编译这个 DSL 会生成 prismaClient 的代码,之后就可以调用它的 find、delete、create 等 api 来做 CRUD 了。

# 相同点

  1. 支持 TypeScript:两者都提供强大的 TypeScript 支持,使得开发者可以享受到类型安全的好处。
  2. 数据库支持:它们都支持多种流行的 SQL 数据库系统,如 PostgreSQL、MySQL 和 SQLite。
  3. 迁移支持:Prisma 和 TypeORM 均提供迁移工具,帮助开发者在数据库结构变化时保持数据一致性。

# 不同点

  1. 架构和工作流

    • Prisma:使用单一的 schema.prisma 文件来定义数据模型和配置,从而生成 Prisma Client。Prisma 倾向于在编译时处理更多逻辑,通过 Prisma Client 提供更多的编译时检查和自动补全。
    • TypeORM:通过装饰器(decorators)或者模型类直接在代码中定义模型。TypeORM 的工作流更传统,更接近于其他语言中的 ORM 框架。
  2. 类型安全

    • Prisma:强调编译时的类型安全,Prisma Client 的查询几乎可以做到完全的类型推导。
    • TypeORM:虽然也支持 TypeScript,但在一些复杂查询中可能需要手动指定或验证类型。
  3. 性能和效率

    • Prisma:在某些场景下,由于其查询引擎和客户端是用 Rust 编写,可能提供更优的性能。
    • TypeORM:性能在某些复杂关联加载(eager loading)场景下可能会有所不足。
  4. 易用性和学习曲线

    • Prisma:提供了更简洁的 API 和较低的学习曲线,特别是对于新项目,初始化和配置过程更直观简单。
    • TypeORM:功能更为全面,灵活性更高,但可能需要更多时间来学习和掌握所有的功能和配置。
  5. 社区和生态

    • Prisma:虽然是相对较新的框架,但已经快速发展,拥有活跃的社区和持续的更新。
    • TypeORM:拥有成熟稳定的用户基础和广泛的社区支持,适合各种规模的项目。