跳至主要內容

PostgreSQL

PostgreSQL 資料來源連接器將 Prisma ORM 連接到 PostgreSQL 資料庫伺服器。

預設情況下,PostgreSQL 連接器包含一個負責連接到您的資料庫的資料庫驅動程式。您可以透過 驅動程式轉接器 (driver adapter)(預覽版)使用來自 Prisma Client 的 JavaScript 資料庫驅動程式來連接到您的資料庫。

資訊

急需一個 Postgres 實例嗎?

透過 Prisma Postgres,您可以在三次點擊內讓資料庫在裸機上執行。包含連線池 (connection pooling)、查詢快取 (query caching) 和自動備份功能。立即開始。

想要以更快的速度開始使用 Prisma Postgres?只需在終端機中執行 npx prisma init --db 即可。🚀

範例

若要連接到 PostgreSQL 資料庫伺服器,您需要在 Prisma Schema 中設定 datasource 區塊。

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

datasource 區塊指定了 postgresql 資料來源連接器。

在 Prisma ORM 7 中,資料庫連線 URL 設定於 prisma.config.ts

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

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

此設定使用 環境變數 來提供資料庫連線 URL。

使用 node-postgres 驅動程式

v5.4.0 起,您可以將 Prisma ORM 與來自 JavaScript 生態系統的資料庫驅動程式搭配使用(而不是使用 Prisma ORM 內建的驅動程式)。您可以透過使用 驅動程式轉接器 (driver adapter) 來達成此目的。

對於 PostgreSQL,node-postgres (pg) 是 JavaScript 生態系統中最受歡迎的驅動程式之一。它可以用於任何透過 TCP 存取的 PostgreSQL 資料庫。

本節說明如何將其與 Prisma ORM 和 @prisma/adapter-pg 驅動程式轉接器搭配使用。

1. 安裝相依套件

首先,安裝 Prisma ORM 用於 pg 的驅動程式轉接器

npm install @prisma/adapter-pg

2. 使用驅動程式轉接器實例化 Prisma Client

現在,當您實例化 Prisma Client 時,您需要將 Prisma ORM 驅動程式轉接器的實例傳遞給 PrismaClient 建構函式。

import 'dotenv/config'
import { PrismaPg } from '@prisma/adapter-pg'
import { PrismaClient } from '../generated/prisma/client'

const connectionString = `${process.env.DATABASE_URL}`

const adapter = new PrismaPg({ connectionString })
const prisma = new PrismaClient({ adapter })

請注意,此程式碼要求 DATABASE_URL 環境變數必須設定為您的 PostgreSQL 連線字串。您可以在下方了解更多關於連線字串的資訊。

注意事項

指定 PostgreSQL Schema

您可以透過在實例化 PrismaPg 時傳入 schema 選項來指定 PostgreSQL schema

const adapter = new PrismaPg(
{ connectionString },
{ schema: 'myPostgresSchema' }
)

連接詳情

連接 URL

Prisma ORM 遵循 PostgreSQL 官方準則 所指定的連線 URL 格式,但不支援所有參數,並包含如 schema 等額外參數。以下是 PostgreSQL 連線 URL 所需元件的總覽。

Structure of the PostgreSQL connection URL

基礎 URL 和路徑

以下是使用大寫字母預留位置的 base URLpath 結構範例。

postgresql://USER:PASSWORD@HOST:PORT/DATABASE

以下元件組成了資料庫的 base URL,它們皆為必要項目:

名稱佔位符描述
主機HOST資料庫伺服器的 IP 位址/網域,例如 localhost
連接埠PORT資料庫伺服器運行的連接埠,例如 5432
UserUSER您的資料庫使用者名稱,例如 janedoe
密碼PASSWORD您的資料庫使用者密碼
資料庫DATABASE您想要使用的 資料庫名稱,例如 mydb

引數

連線 URL 也可以帶有參數。以下是上述同一個範例,其中三個 參數 使用了大寫字母的預留位置。

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?KEY1=VALUE&KEY2=VALUE&KEY3=VALUE

可以使用以下參數:

參數名稱必填預設值描述
schemapublic您想要使用的 schema 名稱,例如 myschema
connection_limitnum_cpus * 2 + 1連線池 (connection pool) 的最大大小(Prisma ORM v6 及更早版本)
connect_timeout5等待開啟新連線的最長秒數,0 表示無逾時
pool_timeout10從連線池等待新連線的最長秒數,0 表示無逾時
sslmodeprefer設定是否使用 TLS。可能的值:preferdisablerequire
sslcert伺服器憑證的路徑。憑證路徑會 相對於 ./prisma 資料夾解析
sslrootcert根憑證的路徑。憑證路徑會 相對於 ./prisma 資料夾解析
sslidentityPKCS12 憑證的路徑
sslpassword用於保護 PKCS12 檔案的密碼
sslacceptaccept_invalid_certs設定是否檢查憑證中遺失的值。可能的值:accept_invalid_certsstrict
host指向包含用於連線的 Socket 之目錄
socket_timeout等待單一查詢終止的最長秒數
pgbouncerfalse設定 Engine 以 啟用 PgBouncer 相容模式
statement_cache_size100自 2.1.0 起:指定每個連線快取的 預備語句 (prepared statements) 數量
application_name自 3.3.0 起:指定 application_name 設定參數的值
channel_bindingprefer自 4.8.0 起:指定 channel_binding 設定參數的值
options自 3.8.0 起:指定在連線開始時傳送給伺服器的命令列選項

舉例來說,如果您想連接到名為 myschema 的 schema,將連線池大小設定為 5,並將查詢逾時設定為 3 秒。您可以使用以下參數

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=myschema&connection_limit=5&socket_timeout=3
Prisma ORM v7 連線池

在 Prisma ORM v7 中,驅動程式轉接器 是關聯式資料庫的預設選項。連線池由您提供的 Node.js 驅動程式(如 pg)處理,而非 Prisma 的連線 URL 參數。請參閱 連線池指南 以獲取 v7 的預設值與設定資訊。

設定 SSL 連線

如果您的資料庫伺服器使用 SSL,您可以在連線 URL 中加入各種參數。以下是可用參數的總覽:

  • sslmode=(disable|prefer|require):
    • prefer(預設):若可能則優先使用 TLS,接受純文字連線。
    • disable:不使用 TLS。
    • require:要求 TLS,若不可行則連線失敗。
  • sslcert=<PATH>:伺服器憑證的路徑。這是資料庫伺服器用於簽署用戶端憑證的根憑證。如果您的系統受信任憑證存放區中不存在此憑證,則需要提供此路徑。對於 Google Cloud,這很可能是 server-ca.pem。憑證路徑會 相對於 ./prisma 資料夾解析
  • sslidentity=<PATH>:由用戶端憑證和金鑰建立的 PKCS12 憑證資料庫路徑。這是以 PKCS12 格式儲存的 SSL 身分檔案,您將使用用戶端金鑰和用戶端憑證產生此檔案。它將這兩個檔案合併成單一檔案,並透過密碼(見下一個參數)保護它們。您可以使用 openssl 命令透過您的用戶端金鑰和憑證建立此檔案。
    openssl pkcs12 -export -out client-identity.p12 -inkey client-key.pem -in client-cert.pem
  • sslpassword=<PASSWORD>:用於保護 PKCS12 檔案的密碼。上一步列出的 openssl 命令在建立 PKCS12 檔案時會要求輸入密碼,您需要在此處提供完全相同的密碼。
  • sslaccept=(strict|accept_invalid_certs):
    • strict:憑證中的任何遺失值都會導致錯誤。對於 Google Cloud,特別是如果資料庫沒有網域名稱,憑證可能會遺失網域/IP 位址,導致連線時發生錯誤。
    • accept_invalid_certs(預設):繞過此檢查。請注意此設定帶來的安全性後果。

您的資料庫連線 URL 將類似於:

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?sslidentity=client-identity.p12&sslpassword=mypassword&sslcert=rootca.cert

透過 Socket 連線

若要透過 Socket 連線至您的 PostgreSQL 資料庫,您必須將 host 欄位作為 查詢參數 (query parameter) 新增至連線 URL(而非將其設定為 URI 的 host 部分)。此參數的值必須指向包含 Socket 的目錄,例如:postgresql://USER:PASSWORD@localhost/database?host=/var/run/postgresql/

請注意,localhost 是必需的,該值本身會被忽略,可以是任何內容。

注意:您可以在此 GitHub issue 中找到更多背景資訊。

PostgreSQL 與 Prisma Schema 之間的型別對應

這兩個表格展示了 PostgreSQL 與 Prisma Schema 之間的型別對應。首先是 Prisma ORM 純量型別 (scalar types) 如何轉換為 PostgreSQL 資料庫欄位型別,接著是 PostgreSQL 資料庫欄位型別如何對應至 Prisma ORM 純量與原生型別

或者,請參閱 Prisma Schema 參考資料,了解按 Prisma 型別整理的對應關係。

Prisma ORM 純量型別與 PostgreSQL 資料庫欄位型別之間的對應

PostgreSQL 連接器將來自 Prisma ORM 資料模型純量型別 映射至資料庫欄位型別如下:

Prisma ORMPostgreSQL
Stringtext
Booleanboolean
Intinteger
BigIntbigint
Floatdouble precision
Decimaldecimal(65,30)
DateTimetimestamp(3)
Jsonjsonb
Bytesbytea

PostgreSQL 資料庫欄位型別與 Prisma ORM 純量和原生型別之間的對應

PostgreSQL (型別 | 別名)支援Prisma ORM原生資料庫類型屬性註解
bigint | int8✔️BigInt@db.BigInt** BigInt 的預設對應 - Schema 中未加入型別屬性。
boolean | bool✔️Bool@db.Boolean** Bool 的預設對應 - Schema 中未加入型別屬性。
timestamp with time zone | timestamptz✔️DateTime@db.Timestamptz(x)
time without time zone | time✔️DateTime@db.Time(x)
time with time zone | timetz✔️DateTime@db.Timetz(x)
numeric(p,s) | decimal(p,s)✔️Decimal@db.Decimal(x, y)
real | float, float4✔️Float@db.Real
double precision | float8✔️Float@db.DoublePrecision** Float 的預設對應 - Schema 中未加入型別屬性。
smallint | int2✔️Int@db.SmallInt
integer | int, int4✔️Int@db.Int** Int 的預設對應 - Schema 中未加入型別屬性。
smallserial | serial2✔️Int@db.SmallInt @default(autoincrement())
serial | serial4✔️Int@db.Int @default(autoincrement())
bigserial | serial8✔️Int@db.BigInt @default(autoincrement()
character(n) | char(n)✔️String@db.Char(x)
character varying(n) | varchar(n)✔️String@db.VarChar(x)
money✔️Decimal@db.Money
text✔️String@db.Text** String 的預設對應 - Schema 中未加入型別屬性。
timestamp✔️DateTime@db.TimeStamp** DateTime 的預設對應 - Schema 中未加入型別屬性。
date✔️DateTime@db.Date
enum✔️Enum不適用
inet✔️String@db.Inet
bit(n)✔️String@Bit(x)
bit varying(n)✔️String@VarBit
oid✔️Int@db.Oid
uuid✔️String@db.Uuid
json✔️Json@db.Json
jsonb✔️Json@db.JsonB** Json 的預設對應 - Schema 中未加入型別屬性。
bytea✔️Bytes@db.ByteA** Bytes 的預設對應 - Schema 中未加入型別屬性。
xml✔️String@db.Xml
陣列型別 (Array types)✔️[]
citext✔️*String@db.Citext* 僅在 啟用 Citext 擴充功能 時可用。
interval尚未支援Unsupported
cidr尚未支援Unsupported
macaddr尚未支援Unsupported
tsvector尚未支援Unsupported
tsquery尚未支援Unsupported
int4range尚未支援Unsupported
int8range尚未支援Unsupported
numrange尚未支援Unsupported
tsrange尚未支援Unsupported
tstzrange尚未支援Unsupported
daterange尚未支援Unsupported
point尚未支援Unsupported
line尚未支援Unsupported
lseg尚未支援Unsupported
box尚未支援Unsupported
path尚未支援Unsupported
polygon (多邊形)尚未支援Unsupported
circle尚未支援Unsupported
複合類型 (Composite types)尚未支援不適用
網域型別 (Domain types)尚未支援不適用

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

schema.prisma
model Device {
id Int @id @default(autoincrement())
name String
data Unsupported("circle")
}

預備語句快取 (Prepared statement caching)

預備語句 (Prepared statement) 是一種可用於最佳化效能的功能。預備語句只需解析、編譯並最佳化一次,之後即可直接執行多次,無需再次解析查詢,從而減少開銷。

透過快取預備語句,Prisma Client 的 查詢引擎 (query engine) 不會重複編譯相同的查詢,這減少了資料庫 CPU 使用率與查詢延遲。

例如,以下是 Prisma Client 發出的兩個不同查詢所產生的 SQL:

SELECT * FROM user WHERE name = "John";
SELECT * FROM user WHERE name = "Brenda";

參數化之後的這兩個查詢會是相同的,第二個查詢可以跳過預備步驟,節省資料庫 CPU 並減少一次往返 (roundtrip) 的開銷。參數化後的查詢:

SELECT * FROM user WHERE name = $1

Prisma Client 維護的每個資料庫連線都有一個獨立的快取,用於儲存預備語句。此快取的大小可以透過連線字串中的 statement_cache_size 參數進行調整。預設情況下,Prisma Client 每個連線會快取 100 個語句。

由於 pgBouncer 的特性,如果 pgbouncer 參數設定為 true,則該連線的預備語句快取會自動停用。

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