如何使用 Prisma ORM 的类型系统
本指南介绍了 Prisma ORM 的类型系统,并解释了如何自省数据库中现有的原生类型,以及在使用 Prisma Migrate 或 db push 将 schema 更改应用到数据库时如何使用类型。
Prisma ORM 的类型系统是如何工作的?
Prisma ORM 使用*类型*来定义字段可以包含的数据种类。为了方便上手,Prisma ORM 提供了一些核心的标量类型,这些类型应该涵盖了大多数默认用例。例如,考虑以下博客文章模型
datasource db {
provider = "postgresql"
}
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) 类型映射。为此,请在 createdAt 字段中添加 @db.Date 原生类型属性
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 表,其中包含
- 一个数据类型为
serial的id列 - 一个数据类型为
text的name列 - 一个数据类型为
boolean的isActive列
您可以使用以下 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
model User {
id Int @id @default(autoincrement())
name String
isActive Boolean
}
数据库中的 id、name 和 isActive 列分别映射到 Int、String 和 Boolean Prisma ORM 类型。数据库类型是这些 Prisma ORM 类型的*默认*数据库类型,因此 Prisma ORM 不会添加任何原生类型属性。
现在通过运行以下 SQL 命令向数据库添加一个数据类型为 date 的 createdAt 列
ALTER TABLE "public"."User"
ADD COLUMN "createdAt" date NOT NULL;
再次自省您的数据库
npx prisma db pull
您的 Prisma schema 现在包含一个新的 createdAt 字段,其 Prisma ORM 类型为 DateTime。createdAt 字段还有一个 @db.Date 原生类型属性,因为 PostgreSQL 的 date 不是 DateTime 类型的默认类型
model User {
id Int @id @default(autoincrement())
name String
isActive Boolean
createdAt DateTime @db.Date
}
在将 schema 更改应用到数据库时如何使用类型
当您使用 Prisma Migrate 或 db push 将 schema 更改应用到数据库时,Prisma ORM 将使用每个字段的 Prisma ORM 标量类型及其任何原生属性来确定数据库中相应列的正确数据库类型。
举个例子,创建一个包含以下 Post 模型的 Prisma schema
model Post {
id Int @id
title String
createdAt DateTime
updatedAt DateTime @db.Date
}
这个 Post 模型有
- 一个 Prisma ORM 类型为
Int的id字段 - 一个 Prisma ORM 类型为
String的title字段 - 一个 Prisma ORM 类型为
DateTime的createdAt字段 - 一个 Prisma ORM 类型为
DateTime且带有@db.Date原生类型属性的updatedAt字段
现在,从项目根目录运行以下命令,将这些更改应用到空的 PostgreSQL 数据库
npx prisma db push
您将看到数据库中有一个新创建的 Post 表,其中包含
- 一个数据库类型为
integer的id列 - 一个数据库类型为
text的title列 - 一个数据库类型为
timestamp(3)的createdAt列 - 一个数据库类型为
date的updatedAt列
请注意,@db.Date 原生类型属性将 updatedAt 列的数据库类型修改为 date,而不是默认的 timestamp(3)。
更多关于使用 Prisma ORM 类型系统的信息
有关使用 Prisma ORM 类型系统的更多参考信息,请参阅以下资源