跳至主要內容

如何使用 Prisma ORM 的類型系統

本指南介紹 Prisma ORM 的類型系統,並說明如何內省資料庫中現有的原生類型,以及當您使用 Prisma Migrate 或 db push 將 schema 變更套用至資料庫時,如何使用類型。

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
}

當您將 schema 變更套用至資料庫時,如何使用類型

當您使用 Prisma Migrate 或 db push 將 schema 變更套用至資料庫時,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 類型的條目位於此處