如何使用 Prisma ORM 的类型系统
本指南介绍了 Prisma ORM 的类型系统,并解释了如何内省数据库中现有的原生类型,以及如何在使用 Prisma Migrate 或 db push
对数据库应用模式更改时使用类型。
Prisma ORM 的类型系统如何工作?
Prisma ORM 使用类型来定义字段可以保存的数据类型。为了便于入门,Prisma ORM 提供了少量核心标量类型,这些类型应该可以涵盖大多数默认用例。例如,以下博客文章模型
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
字段
model Post {
id Int @id
title String
createdAt DateTime @db.Date
}
原生类型映射允许您表达数据库中的所有类型。但是,如果 Prisma ORM 默认值满足您的需求,则无需使用它们。这将导致更短、更易读的 Prisma 模式,适用于常见用例。
如何内省数据库类型
当您内省现有数据库时,Prisma ORM 将获取每个表列的数据库类型,并使用对应模型字段的正确 Prisma ORM 类型在 Prisma 模式中表示它。如果数据库类型不是该 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 模式
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 模式现在包含了新的 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
}
如何在应用模式更改到数据库时使用类型
当您使用 Prisma Migrate 或 db push
对数据库应用模式更改时,Prisma ORM 将使用每个字段的 Prisma ORM 标量类型及其具有的任何原生属性来确定数据库中对应列的正确数据库类型。
例如,创建一个具有以下 Post
模型的 Prisma 模式
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 类型系统的更多参考信息,请参阅以下资源