跳至主要内容

如何使用 Prisma ORM 的类型系统

本指南介绍了 Prisma ORM 的类型系统,并解释了如何内省数据库中现有的本机类型,以及如何在使用 Prisma Migrate 或 `db push` 对数据库应用模式更改时使用类型。

Prisma ORM 的类型系统如何工作?

Prisma ORM 使用类型来定义字段可以容纳的数据类型。为了便于入门,Prisma ORM 提供了一些核心标量类型,它们应该涵盖大多数默认用例。例如,考虑以下博客文章模型

schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

model Post {
id Int @id
title String
createdAt DateTime
}

`Post` 模型的 `title` 字段使用 `String` 标量类型,而 `createdAt` 字段使用 `DateTime` 标量类型。

数据库也有自己的类型系统,该系统定义了列可以容纳的值类型。大多数数据库提供了大量的类型,以允许对列可以存储的内容进行细粒度的控制。例如,数据库可能提供对多种大小的整数或 XML 数据的内置支持。这些类型的名称因数据库而异。例如,在 PostgreSQL 中,布尔值的列类型为 `boolean`,而在 MySQL 中,通常使用 `tinyint(1)` 类型。

在上面的博客文章示例中,我们使用的是 PostgreSQL 连接器。这在 Prisma 模式中的 `datasource` 块中指定。

默认类型映射

为了让您可以开始使用我们的核心标量类型,Prisma ORM 提供了默认类型映射,这些映射将每个标量类型映射到底层数据库中的默认类型。例如

  • 默认情况下,Prisma ORM 的 `String` 类型映射到 PostgreSQL 的 `text` 类型和 MySQL 的 `varchar` 类型
  • 默认情况下,Prisma ORM 的 `DateTime` 类型映射到 PostgreSQL 的 `timestamp(3)` 类型和 SQL Server 的 `datetime2` 类型

请参阅 Prisma ORM 的数据库连接器页面,了解特定数据库的默认类型映射。例如,此表 给出了 PostgreSQL 的默认类型映射。
要查看特定 Prisma ORM 类型的所有数据库的默认类型映射,请参阅 Prisma 模式参考的模型字段标量类型部分。例如,此表 给出了 `Float` 标量类型的默认类型映射。

本机类型映射

有时您可能需要使用更具体的数据库类型,而不是 Prisma ORM 类型中默认类型映射中的类型。为此,Prisma ORM 提供了本机类型属性 来细化核心标量类型。例如,在上面的 `Post` 模型的 `createdAt` 字段中,您可能希望在底层 PostgreSQL 数据库中使用仅日期的列,方法是使用 `date` 类型而不是默认类型映射 `timestamp(3)`。为此,请将 `@db.Date` 本机类型属性添加到 `createdAt` 字段

schema.prisma
model Post {
id Int @id
title String
createdAt DateTime @db.Date
}

本机类型映射允许您表达数据库中的所有类型。但是,如果您对 Prisma ORM 默认值感到满意,则不必使用它们。这会导致更短、更易读的 Prisma 模式以满足常见用例。

如何内省数据库类型

当您内省 现有数据库时,Prisma ORM 将获取每个表列的数据库类型,并在您的 Prisma 模式中使用对应模型字段的正确 Prisma ORM 类型来表示它。如果数据库类型不是该 Prisma ORM 标量类型的默认数据库类型,Prisma ORM 还会添加一个本机类型属性。

例如,在 PostgreSQL 数据库中,有一个 `User` 表,其中

  • 一个 `id` 列,数据类型为 `serial`
  • 一个 `name` 列,数据类型为 `text`
  • 一个 `isActive` 列,数据类型为 `boolean`

您可以使用以下 SQL 命令创建它

CREATE TABLE "public"."User" (
id serial PRIMARY KEY NOT NULL,
name text NOT NULL,
"isActive" boolean NOT NULL
);

使用以下命令从项目的根目录内省您的数据库

npx prisma db pull

您将获得以下 Prisma 模式

schema.prisma
model User {
id Int @id @default(autoincrement())
name String
isActive Boolean
}

数据库中的 `id`、`name` 和 `isActive` 列分别映射到 `Int`、`String` 和 `Boolean` Prisma ORM 类型。数据库类型是这些 Prisma ORM 类型的默认数据库类型,因此 Prisma ORM 不会添加任何本机类型属性。

现在,通过运行以下 SQL 命令,将 `createdAt` 列添加到数据库,数据类型为 `date`

ALTER TABLE "public"."User"
ADD COLUMN "createdAt" date NOT NULL;

再次内省您的数据库

npx prisma db pull

您的 Prisma 模式现在包括新的 `createdAt` 字段,其 Prisma ORM 类型为 `DateTime`。`createdAt` 字段还具有 `@db.Date` 本机类型属性,因为 PostgreSQL 的 `date` 不是 `DateTime` 类型的默认类型

schema.prisma
model User {
id Int @id @default(autoincrement())
name String
isActive Boolean
createdAt DateTime @db.Date
}

如何在对数据库应用模式更改时使用类型

当您使用 Prisma Migrate 或 `db push` 对数据库应用模式更改时,Prisma ORM 将使用每个字段的 Prisma ORM 标量类型以及它具有的任何本机属性来确定数据库中对应列的正确数据库类型。

例如,创建一个具有以下 `Post` 模型的 Prisma 模式

schema.prisma
model Post {
id Int @id
title String
createdAt DateTime
updatedAt DateTime @db.Date
}

此 `Post` 模型具有

  • 一个 `id` 字段,其 Prisma ORM 类型为 `Int`
  • 一个 `title` 字段,其 Prisma ORM 类型为 `String`
  • 一个 `createdAt` 字段,其 Prisma ORM 类型为 `DateTime`
  • 一个 `updatedAt` 字段,其 Prisma ORM 类型为 `DateTime`,并且具有 `@db.Date` 本机类型属性

现在,使用以下命令将这些更改应用到空 PostgreSQL 数据库,从项目的根目录运行该命令

npx prisma db push

您将看到数据库中有一个新创建的 `Post` 表,其中

  • 一个 `id` 列,数据库类型为 `integer`
  • 一个 `title` 列,数据库类型为 `text`
  • 一个 `createdAt` 列,数据库类型为 `timestamp(3)`
  • 一个 `updatedAt` 列,数据库类型为 `date`

请注意,`@db.Date` 本机类型属性将 `updatedAt` 列的数据库类型修改为 `date`,而不是默认的 `timestamp(3)`。

有关使用 Prisma ORM 类型系统的更多信息

有关使用 Prisma ORM 类型系统的更多参考信息,请参阅以下资源

  • 每个数据库提供者的数据库连接器 页面都有一个类型映射部分,其中包含一个 Prisma ORM 类型与数据库类型之间的默认类型映射表,以及一个数据库类型表,其中列出了它们在 Prisma ORM 中对应的本机类型属性。例如,PostgreSQL 的类型映射部分在这里
  • Prisma 模式参考的模型字段标量类型 部分包含每个 Prisma ORM 标量类型的子部分。这包括每个数据库中该 Prisma ORM 类型的默认映射表,以及每个数据库的表,其中列出了对应的数据库类型及其在 Prisma ORM 中的本机类型属性。例如,`String` Prisma ORM 类型的条目在这里