如何使用 Prisma ORM 的類型系統
本指南介紹 Prisma ORM 的類型系統,並說明如何內省資料庫中現有的原生類型,以及當您使用 Prisma Migrate 或 db push
將 schema 變更套用至資料庫時,如何使用類型。
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 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
欄位
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 類型系統的更多參考資訊,請參閱以下資源