跳至主要內容

MySQL/MariaDB

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

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

範例

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

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

datasource 區塊指定了 mysql 資料來源連接器,該連接器同時適用於 MySQL 和 MariaDB。

在 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。

使用 mariadb 驅動程式

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

對於 MySQL 和 MariaDB,mariadb 是 JavaScript 生態系統中最受歡迎的驅動程式之一。

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

1. 安裝相依套件

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

npm install @prisma/adapter-mariadb

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

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

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

const adapter = new PrismaMariaDb({
host: "localhost",
port: 3306,
connectionLimit: 5
})
const prisma = new PrismaClient({ adapter })

連接詳情

連接 URL

以下是 MySQL 連接 URL 所需元件的總覽。

Structure of the MySQL connection URL

基礎 URL 和路徑

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

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

下列元件構成了資料庫的 base URL,這些元件為必填項。

名稱佔位符描述
主機HOST資料庫伺服器的 IP 位址或網域名稱,例如 localhost
連接埠PORT資料庫伺服器運行的連接埠,例如 5432(預設為 3306;若使用 Unix socket 則無須連接埠)。
User使用者 (USER)您的資料庫使用者名稱,例如 janedoe
密碼PASSWORD您的資料庫使用者密碼
資料庫DATABASE您想要使用的 資料庫 名稱,例如 mydb

引數

連接 URL 也可以接受參數。以下是上述範例的相同結構,並使用大寫字母作為三個 參數 的預留位置。

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

可以使用以下參數:

參數名稱必填預設值描述
connection_limitnum_cpus * 2 + 1連線池 (connection pool) 的最大大小(Prisma ORM v6 及更早版本)
connect_timeout5等待開啟新連接的最大秒數;0 表示沒有逾時限制。
pool_timeout10等待從連接池取得新連接的最大秒數;0 表示沒有逾時限制。
sslcert伺服器憑證的路徑。憑證路徑會 相對於 ./prisma 資料夾進行解析
sslidentityPKCS12 憑證的路徑。
sslpassword用於保護 PKCS12 檔案的密碼。
sslacceptaccept_invalid_certs設定是否檢查憑證中遺失的值。可選值:accept_invalid_certs, strict
socket指向包含連接所用 socket 的目錄。
socket_timeout等待單一查詢終止的秒數。

例如,如果您想將連接池大小設為 5 並將查詢逾時時間設為 3 秒,可以使用以下參數。

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

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

設定 SSL 連接

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

  • 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 看起來會類似這樣:

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

透過 Sockets 連接

要透過 socket 連接到 MySQL/MariaDB 資料庫,您必須將 socket 欄位作為 查詢參數 (query parameter) 加入連接 URL(而非將其設定為 URI 的 host 部分)。此參數的值必須指向包含 socket 的目錄,例如在 Ubuntu 或 Debian 預設安裝的 MySQL/MariaDB 上:mysql://USER:PASSWORD@HOST/DATABASE?socket=/run/mysqld/mysqld.sock

請注意,localhost 是必填項,但該值本身會被忽略,可以填寫任何內容。

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

MySQL 到 Prisma Schema 的類型映射

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

或者,請參閱 Prisma Schema 參考 以獲取按 Prisma ORM 類型分類的類型映射。

Prisma ORM 到 MySQL 的原生類型映射

Prisma ORMMySQL註解
StringVARCHAR(191)
BooleanBOOLEAN在 MySQL 中,BOOLEANTINYINT(1) 的同義詞。
IntINT
BigIntBIGINT
FloatDOUBLE
DecimalDECIMAL(65,30)
DateTimeDATETIME(3)目前,Prisma ORM 不支援 MySQL 中的零日期 (0000-00-00, 00:00:00)。
JsonJSON僅在 MySQL 5.7+ 中支援。
BytesLONGBLOB

Prisma ORM 到 MariaDB 的原生類型映射

Prisma ORMMariaDB註解
StringVARCHAR(191)
BooleanBOOLEAN在 MariaDB 中,BOOLEANTINYINT(1) 的同義詞。
IntINT
BigIntBIGINT
FloatDOUBLE
DecimalDECIMAL(65,30)
DateTimeDATETIME(3)
JsonLONGTEXT請參閱 https://mariadb.com/kb/en/json-data-type/
BytesLONGBLOB

原生類型映射

對 MySQL 資料庫進行內省 (introspection) 時,資料庫類型會根據下表映射至 Prisma ORM:

MySQLPrisma ORM支援原生資料庫類型屬性註解
serialBigInt✔️@db.UnsignedBigInt @default(autoincrement())
bigintBigInt✔️@db.BigInt
bigint unsignedBigInt✔️@db.UnsignedBigInt
bitBytes✔️@db.Bit(x)bit(1) 映射至 Boolean,所有其他 bit(x) 映射至 Bytes
boolean | tinyint(1)Boolean✔️@db.TinyInt(1)
varbinaryBytes✔️@db.VarBinary
longblobBytes✔️@db.LongBlob
tinyblobBytes✔️@db.TinyBlob
mediumblobBytes✔️@db.MediumBlob
blobBytes✔️@db.Blob
binaryBytes✔️@db.Binary
dateDateTime✔️@db.Date
datetimeDateTime✔️@db.DateTime
timestampDateTime✔️@db.TimeStamp
timeDateTime✔️@db.Time
decimal(a,b)Decimal✔️@db.Decimal(x,y)
numeric(a,b)Decimal✔️@db.Decimal(x,y)
enumEnum✔️不適用
floatFloat✔️@db.Float
doubleFloat✔️@db.Double
smallintInt✔️@db.SmallInt
smallint unsignedInt✔️@db.UnsignedSmallInt
mediumintInt✔️@db.MediumInt
mediumint unsignedInt✔️@db.UnsignedMediumInt
intInt✔️@db.Int
int unsignedInt✔️@db.UnsignedInt
tinyintInt✔️@db.TinyInt(x)tinyint(1) 映射至 Boolean,所有其他 tinyint(x) 映射至 Int
tinyint unsignedInt✔️@db.UnsignedTinyInt(x)tinyint(1) unsigned 不會映射至 Boolean
yearInt✔️@db.Year
jsonJson✔️@db.Json僅在 MySQL 5.7+ 中支援。
charString✔️@db.Char(x)
varcharString✔️@db.VarChar(x)
tinytextString✔️@db.TinyText
textString✔️@db.Text
mediumtextString✔️@db.MediumText
longtextString✔️@db.LongText
setUnsupported尚未支援
geometryUnsupported尚未支援
pointUnsupported尚未支援
linestringUnsupported尚未支援
polygon (多邊形)Unsupported尚未支援
multipointUnsupported尚未支援
multilinestringUnsupported尚未支援
multipolygonUnsupported尚未支援
geometrycollectionUnsupported尚未支援

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

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

引擎 (Engine)

如果您使用的 MySQL 版本預設引擎為 MyISAM,建立資料表時必須指定 ENGINE = InnoDB;。如果您內省了使用不同引擎的資料庫,Prisma Schema 中的關係將不會被建立(或者若關係已存在,則會遺失)。

權限

全新安裝的 MySQL/MariaDB 預設只有一個 root 資料庫使用者。請勿在 Prisma 設定中使用 root 使用者,請為每個應用程式建立專屬的資料庫與使用者。在大多數 Linux 主機(如 Ubuntu)上,您可以以 Linux root 使用者身分直接執行(該使用者自動擁有資料庫 root 存取權):

mysql -e "CREATE DATABASE IF NOT EXISTS $DB_PRISMA;"
mysql -e "GRANT ALL PRIVILEGES ON $DB_PRISMA.* TO $DB_USER@'%' IDENTIFIED BY '$DB_PASSWORD';"

上述權限足以執行 prisma db pullprisma db push 命令。若要執行 prisma migrate 命令,則需要授予額外的權限。

mysql -e "GRANT CREATE, DROP, REFERENCES, ALTER ON *.* TO $DB_USER@'%';"
© . This site is unofficial and not affiliated with Prisma Data, Inc.