跳转到主要内容

如何使用 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 schema 的 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 schema 参考的模型字段标量类型部分。例如,此表给出了 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 schema 更短、更易读。

如何内省数据库类型

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

例如,在 PostgreSQL 数据库中创建一个 User 表,其中包含

  • 一个数据类型为 serialid
  • 一个数据类型为 textname
  • 一个数据类型为 booleanisActive

您可以使用以下 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

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

数据库中的 idnameisActive 列分别映射到 IntStringBoolean Prisma ORM 类型。数据库类型是这些 Prisma ORM 类型的默认数据库类型,因此 Prisma ORM 不会添加任何原生类型属性。

现在通过运行以下 SQL 命令,向您的数据库添加一个数据类型为 datecreatedAt

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

再次内省您的数据库

npx prisma db pull

您的 Prisma schema 现在包含新的 createdAt 字段,其 Prisma ORM 类型为 DateTimecreatedAt 字段还具有 @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

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

Post 模型具有

  • 一个 Prisma ORM 类型为 Intid 字段
  • 一个 Prisma ORM 类型为 Stringtitle 字段
  • 一个 Prisma ORM 类型为 DateTimecreatedAt 字段
  • 一个 Prisma ORM 类型为 DateTime 且具有 @db.Date 原生类型属性的 updatedAt 字段

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

npx prisma db push

您将看到数据库中新创建了一个 Post 表,其中包含

  • 一个数据库类型为 integerid
  • 一个数据库类型为 texttitle
  • 一个数据库类型为 timestamp(3)createdAt
  • 一个数据库类型为 dateupdatedAt

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

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

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

  • 每个数据库提供程序的数据库连接器页面都有一个类型映射部分,其中包含 Prisma ORM 类型和数据库类型之间的默认类型映射表,以及一个数据库类型表,其中列出了它们在 Prisma ORM 中的相应原生类型属性。例如,PostgreSQL 的类型映射部分在此处
  • Prisma schema 参考的模型字段标量类型部分包含每个 Prisma ORM 标量类型的子部分。这包括每个数据库中该 Prisma ORM 类型的默认映射表,以及每个数据库的表,其中列出了相应的数据库类型及其在 Prisma ORM 中的原生类型属性。例如,String Prisma ORM 类型的条目在此处