跳至主要內容

CockroachDB

本指南討論了使用 Prisma ORM 和 CockroachDB 背後的概念,解釋了 CockroachDB 與其他資料庫提供者之間的共通點與差異,並引導您完成應用程式整合 CockroachDB 的配置過程。

資訊

CockroachDB 連接器在 3.14.0 及更高版本中已正式發布(GA)。它最初在 3.9.0 版本中作為預覽功能(Preview feature)加入並支援內省(Introspection),而對 Prisma Migrate 的支援則在 3.11.0 版本中加入。

什麼是 CockroachDB?

CockroachDB 是一款分散式資料庫,專為可擴展性(scalability)和高可用性(high availability)而設計。其功能包括:

  • 與 PostgreSQL 相容: CockroachDB 與 PostgreSQL 相容,可與現有產品的大型生態系統進行互通。
  • 內建擴展: CockroachDB 具有自動複製、故障轉移和修復功能,讓您的應用程式能輕鬆進行水平擴展。

與其他資料庫提供者的共通點

CockroachDB 在很大程度上與 PostgreSQL 相容,且大多數情況下能以相同的方式搭配 Prisma ORM 使用。您仍然可以:

需考慮的差異

使用 Prisma ORM 的 cockroachdb 連接器時,需要注意一些 CockroachDB 特有的差異:

如何搭配 CockroachDB 使用 Prisma ORM

本節提供更多關於如何使用 CockroachDB 特定功能的詳細資訊。

如何使用 CockroachDB 的原生類型

CockroachDB 有自己的一套原生資料類型,Prisma ORM 亦支援。例如,CockroachDB 使用 STRING 資料類型而非 PostgreSQL 的 VARCHAR

作為演示,假設您使用以下 SQL 命令在 CockroachDB 資料庫中建立一個 User 資料表:

CREATE TABLE public."Post" (
"id" INT8 NOT NULL,
"title" VARCHAR(200) NOT NULL,
CONSTRAINT "Post_pkey" PRIMARY KEY ("id" ASC),
FAMILY "primary" ("id", "title")
);

使用 npx prisma db pull 進行資料庫內省後,您的 Prisma Schema 中將會有一個新的 Post 模型:

schema.prisma
model Post {
id BigInt @id
title String @db.String(200)
}

請注意,title 欄位已標註為 @db.String(200) —— 這與 PostgreSQL 不同,在 PostgreSQL 中該標註會是 @db.VarChar(200)

如需完整的類型映射列表,請參閱我們的連接器文件

如何在 CockroachDB 中使用資料庫鍵

在像 CockroachDB 這樣的分散式資料庫中生成唯一識別碼時,最好避免使用順序 ID —— 欲了解更多相關資訊,請參閱 CockroachDB 關於選擇索引鍵(index keys)的部落格文章

相反地,Prisma ORM 提供了 autoincrement() 屬性函數,它使用 CockroachDB 的 unique_rowid() 函數 來生成唯一識別碼。例如,以下的 User 模型有一個 id 主鍵,是使用 autoincrement() 函數生成的:

schema.prisma
model User {
id BigInt @id @default(autoincrement())
name String
}

為了與現有資料庫相容,有時您可能仍需要生成固定的整數鍵值序列。在這些情況下,您可以使用 Prisma ORM 內建的針對 CockroachDB 的 sequence() 函數。關於 sequence() 函數的可用選項列表,請參閱我們的參考文件

欲了解更多關於生成資料庫鍵的資訊,請參閱 CockroachDB 的主鍵最佳實踐指南。

範例

要連接到 CockroachDB 資料庫伺服器,您需要在您的 Prisma schema 中配置一個 datasource 區塊:

schema.prisma
datasource db {
provider = "cockroachdb"
}

資料庫連接 URL 配置在 prisma.config.ts 中:

prisma.config.ts
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'

export default defineConfig({
schema: 'prisma/schema.prisma',
datasource: {
url: env('DATABASE_URL'),
},
})
資訊

使用 Prisma CLI 命令時,環境變數不會自動載入。您需要使用像 dotenv 這樣的套件從 .env 檔案載入環境變數,或確保您的環境變數已在您的 shell 中設定。

傳遞給 datasource 區塊的欄位有:

  • provider:指定 cockroachdb 資料來源連接器。
  • url 欄位在 prisma.config.ts 中配置,並指定 CockroachDB 資料庫伺服器的連接 URL
資訊

雖然 cockroachdbpostgresql 連接器很相似,但從 5.0.0 版本開始,從應用程式連接到 CockroachDB 資料庫時,強制要求使用 cockroachdb 連接器而非 postgresql

連接詳情

CockroachDB 使用 PostgreSQL 格式的連接 URL。有關此格式及其採用的選用參數,請參閱 PostgreSQL 連接器文件

CockroachDB 與 PostgreSQL 之間的差異

下表列出了 CockroachDB 與 PostgreSQL 之間的差異:

議題領域註解
在 CockroachDB 中,預設情況下 INT 類型是 INT8 的別名,而在 PostgreSQL 中它是 INT4 的別名。這意味著 Prisma ORM 會將 CockroachDB 中的 INT 欄位內省為 BigInt,而在 PostgreSQL 中,Prisma ORM 則會將其內省為 Int結構描述 (Schema)欲了解更多關於 INT 類型的資訊,請參閱 CockroachDB 文件
在欄位上使用 @default(autoincrement()) 時,CockroachDB 會自動為資料列 ID 生成 64 位元整數。這些整數會遞增但非連續。這與 PostgreSQL 不同,在 PostgreSQL 中生成的資料列 ID 是連續的且從 1 開始。結構描述 (Schema)欲了解更多關於生成值的資訊,請參閱 CockroachDB 文件
@default(autoincrement()) 屬性只能與 BigInt 欄位類型搭配使用。結構描述 (Schema)欲了解更多關於生成值的資訊,請參閱 CockroachDB 文件

CockroachDB 中的類型映射限制

CockroachDB 連接器將 Prisma ORM 資料模型中的純量類型 (scalar types) 映射到原生欄位類型。這些原生類型大多與 PostgreSQL 相同 —— 詳情請參閱從 Prisma ORM 到 CockroachDB 的原生類型映射。然而,仍存在一些限制:

CockroachDB (類型 | 別名)Prisma ORM支援原生資料庫類型屬性註解
moneyDecimal尚未支援@db.MoneyPostgreSQL 支援,但目前 CockroachDB 尚未支援
xmlString尚未支援@db.XmlPostgreSQL 支援,但目前 CockroachDB 尚未支援
jsonb 陣列Json[]尚未支援不適用Json[] 在 PostgreSQL 中支援,但目前 CockroachDB 尚未支援

其他限制

下表列出了 CockroachDB 相對於 PostgreSQL 的其他已知限制:

議題領域註解
不支援 HashGistSpGistBrin 索引類型。結構描述 (Schema)在 PostgreSQL 中,Prisma ORM 允許配置索引以使用不同的索引存取方法。CockroachDB 目前僅支援 BTreeGin
不支援推送到 Enum 類型Client推送到 Enum 類型(例如 data: { enum { push: "A" }, })目前在 CockroachDB 中不支援
不支援在沒有全文索引的情況下搜尋 String 欄位Client在沒有全文索引的情況下搜尋 String 欄位(例如 where: { text: { search: "cat & dog", }, },)目前在 CockroachDB 中不支援
不支援整數除法Client整數除法(例如 data: { int: { divide: 10, }, })目前在 CockroachDB 中不支援
Json 欄位的篩選限制Client目前 CockroachDB 對 Json 欄位僅支援 equalsnot 篩選

CockroachDB 與 Prisma schema 之間的類型映射

CockroachDB 連接器將 Prisma ORM 資料模型中的純量類型 (scalar types) 映射到原生欄位類型如下:

或者,請參閱Prisma schema 參考文件中按 Prisma ORM 類型組織的類型映射。

從 Prisma ORM 到 CockroachDB 的原生類型映射

Prisma ORMCockroachDB
StringSTRING
BooleanBOOL
IntINT4
BigIntINT8
FloatFLOAT8
DecimalDECIMAL(65,30)
DateTimeTIMESTAMP(3)
JsonJSONB
BytesBYTES

內省時從 CockroachDB 到 Prisma ORM 類型的映射

內省 CockroachDB 資料庫時,資料庫類型會根據下表映射到 Prisma ORM:

CockroachDB (類型 | 別名)Prisma ORM支援原生資料庫類型屬性註解
INT | BIGINT, INTEGERBigInt✔️@db.Int8
BOOL | BOOLEANBool✔️@db.Bool*
TIMESTAMP | TIMESTAMP WITHOUT TIME ZONEDateTime✔️@db.Timestamp(x)
TIMESTAMPTZ | TIMESTAMP WITH TIME ZONEDateTime✔️@db.Timestamptz(x)
TIME | TIME WITHOUT TIME ZONEDateTime✔️@db.Time(x)
TIMETZ | TIME WITH TIME ZONEDateTime✔️@db.Timetz(x)
DECIMAL(p,s) | NUMERIC(p,s), DEC(p,s)Decimal✔️@db.Decimal(x, y)
REAL | FLOAT4, FLOATFloat✔️@db.Float4
DOUBLE PRECISION | FLOAT8Float✔️@db.Float8
INT2 | SMALLINTInt✔️@db.Int2
INT4Int✔️@db.Int4
CHAR(n) | CHARACTER(n)String✔️@db.Char(x)
"char"String✔️@db.CatalogSingleCharCockroachDB 目錄表 (catalog tables) 的內部類型,不供終端使用者使用。
STRING | TEXT, VARCHARString✔️@db.String
DATEDateTime✔️@db.Date
ENUMenum✔️不適用
INETString✔️@db.Inet
BIT(n)String✔️@Bit(x)
VARBIT(n) | BIT VARYING(n)String✔️@VarBit
OIDInt✔️@db.Oid
UUIDString✔️@db.Uuid
JSONB | JSONJson✔️@db.JsonB
陣列類型 (Array types)[]✔️

內省 (Introspection) 會將尚未支援的原生資料庫類型添加為 Unsupported 欄位

schema.prisma
model Device {
id BigInt @id @default(autoincrement())
interval Unsupported("INTERVAL")
}

更多關於搭配 Prisma ORM 使用 CockroachDB 的資訊

開始搭配 Prisma ORM 使用 CockroachDB 的最快方法是參考我們的「入門指南 (Getting Started)」文件:

這些教學將帶領您完成連接 CockroachDB、遷移結構描述 (schema) 以及使用 Prisma Client 的過程。

更多參考資訊可在 CockroachDB 連接器文件中找到。

© . This site is unofficial and not affiliated with Prisma Data, Inc.