MySQL/MariaDB
MySQL 資料來源聯結器將 Prisma ORM 連線到 MySQL 或 MariaDB 資料庫伺服器。
預設情況下,MySQL 聯結器包含一個負責連線到資料庫的資料庫驅動。你可以使用 驅動介面卡(預覽)透過 Prisma Client 使用 JavaScript 資料庫驅動連線到你的資料庫。
示例
要連線到 MySQL 資料庫伺服器,你需要在 Prisma schema 中配置一個 datasource 塊。
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
傳遞給 datasource 塊的欄位有:
provider:指定mysql資料來源聯結器,它既用於 MySQL 也用於 MariaDB。url:指定 MySQL 資料庫伺服器的 連線 URL。在這種情況下,使用環境變數 提供連線 URL。
連線詳情
連線 URL
以下是 MySQL 連線 URL 所需元件的概覽:

基本 URL 和路徑
以下是使用大寫佔位符值的 *基本 URL* 和 *路徑* 結構示例:
mysql://USER:PASSWORD@HOST:PORT/DATABASE
以下元件構成了資料庫的 *基本 URL*,它們始終是必需的:
| 名稱 | 佔位符 | 描述 |
|---|---|---|
| 主機 | HOST | 資料庫伺服器的 IP 地址/域名,例如 localhost |
| 埠 | PORT | 資料庫伺服器正在執行的埠,例如 5432(預設是 3306,或使用 Unix socket 時無埠) |
| 使用者 | USER | 資料庫使用者名稱,例如 janedoe |
| 密碼 | PASSWORD | 資料庫使用者的密碼 |
| 資料庫 | DATABASE | 你想要使用的 資料庫 名稱,例如 mydb |
你必須 對特殊字元進行百分比編碼。
引數
連線 URL 也可以接受引數。以下是上面示例的相同內容,其中三個 *引數* 使用大寫佔位符值:
mysql://USER:PASSWORD@HOST:PORT/DATABASE?KEY1=VALUE&KEY2=VALUE&KEY3=VALUE
可以使用以下引數:
| 引數名稱 | 必需 | 預設值 | 描述 |
|---|---|---|---|
connection_limit | 否 | num_cpus * 2 + 1 | 連線池 的最大大小 |
connect_timeout | 否 | 5 | 等待新連線開啟的最長秒數,0 表示無超時 |
pool_timeout | 否 | 10 | 從連線池中等待新連線的最長秒數,0 表示無超時 |
sslcert | 否 | 伺服器證書的路徑。證書路徑 相對於 ./prisma 資料夾解析 | |
sslidentity | 否 | PKCS12 證書的路徑 | |
sslpassword | 否 | 用於保護 PKCS12 檔案的密碼 | |
sslaccept | 否 | accept_invalid_certs | 配置是否檢查證書中缺失的值。可能的值:accept_invalid_certs, strict |
socket | 否 | 指向包含用於連線的 socket 的目錄 | |
socket_timeout | 否 | 等待單個查詢終止的秒數 |
例如,如果你想將連線池大小設定為 5 並配置查詢超時為 3 秒,你可以使用以下引數:
mysql://USER:PASSWORD@HOST:PORT/DATABASE?connection_limit=5&socket_timeout=3
配置 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
透過套接字連線
要透過套接字連線到 MySQL/MariaDB 資料庫,你必須在連線 URL 中新增一個 socket 欄位作為 *查詢引數*(而不是將其設定為 URI 的 host 部分)。此引數的值必須指向包含套接字的目錄,例如,在 Ubuntu 或 Debian 上預設安裝的 MySQL/MariaDB 上使用:mysql://USER:PASSWORD@HOST/DATABASE?socket=/run/mysqld/mysqld.sock
請注意,localhost 是必需的,其值本身被忽略,可以是任何值。
注意:你可以在此 GitHub issue 中找到更多上下文資訊。
MySQL 到 Prisma schema 的型別對映
MySQL 聯結器將 Prisma ORM 資料模型 中的 標量型別 對映到原生列型別如下:
或者,請參閱 Prisma schema 參考,瞭解按 Prisma ORM 型別組織的型別對映。
從 Prisma ORM 到 MySQL 的原生型別對映
| Prisma ORM | MySQL | 備註 |
|---|---|---|
String (字串) | VARCHAR(191) | |
Boolean (布林) | BOOLEAN | 在 MySQL 中,BOOLEAN 是 TINYINT(1) 的同義詞 |
Int (整數) | INT | |
BigInt (大整數) | BIGINT | |
Float (浮點數) | DOUBLE | |
Decimal (十進位制) | DECIMAL(65,30) | |
DateTime (日期時間) | DATETIME(3) | 目前,Prisma ORM 不支援 MySQL 中的零日期(0000-00-00, 00:00:00) |
Json | JSON | 僅在 MySQL 5.7+ 中受支援 |
Bytes (位元組) | LONGBLOB |
從 Prisma ORM 到 MariaDB 的原生型別對映
| Prisma ORM | MariaDB | 備註 |
|---|---|---|
String (字串) | VARCHAR(191) | |
Boolean (布林) | BOOLEAN | 在 MariaDB 中,BOOLEAN 是 TINYINT(1) 的同義詞 |
Int (整數) | INT | |
BigInt (大整數) | BIGINT | |
Float (浮點數) | DOUBLE | |
Decimal (十進位制) | DECIMAL(65,30) | |
DateTime (日期時間) | DATETIME(3) | |
Json | LONGTEXT | 請參閱 https://mariadb.com/kb/en/json-data-type/ |
Bytes (位元組) | LONGBLOB |
原生型別對映
內省 MySQL 資料庫時,資料庫型別將根據下表對映到 Prisma ORM:
| MySQL | Prisma ORM | 支援 | 原生資料庫型別屬性 | 備註 |
|---|---|---|---|---|
serial (序列) | BigInt (大整數) | ✔️ | @db.UnsignedBigInt @default(autoincrement()) | |
bigint (大整數) | BigInt (大整數) | ✔️ | @db.BigInt | |
bigint unsigned (無符號大整數) | BigInt (大整數) | ✔️ | @db.UnsignedBigInt | |
bit (位) | Bytes (位元組) | ✔️ | @db.Bit(x) | bit(1) 對映到 Boolean - 所有其他 bit(x) 對映到 Bytes |
boolean | tinyint(1) | Boolean (布林) | ✔️ | @db.TinyInt(1) | |
varbinary (變長二進位制) | Bytes (位元組) | ✔️ | @db.VarBinary | |
longblob (長二進位制大物件) | Bytes (位元組) | ✔️ | @db.LongBlob | |
tinyblob (微型二進位制大物件) | Bytes (位元組) | ✔️ | @db.TinyBlob | |
mediumblob (中型二進位制大物件) | Bytes (位元組) | ✔️ | @db.MediumBlob | |
blob (二進位制大物件) | Bytes (位元組) | ✔️ | @db.Blob | |
binary (二進位制) | Bytes (位元組) | ✔️ | @db.Binary | |
date (日期) | DateTime (日期時間) | ✔️ | @db.Date | |
datetime (日期時間) | DateTime (日期時間) | ✔️ | @db.DateTime | |
timestamp (時間戳) | DateTime (日期時間) | ✔️ | @db.TimeStamp | |
time (時間) | DateTime (日期時間) | ✔️ | @db.Time | |
decimal(a,b) (十進位制) | Decimal (十進位制) | ✔️ | @db.Decimal(x,y) | |
numeric(a,b) (數值) | Decimal (十進位制) | ✔️ | @db.Decimal(x,y) | |
enum (列舉) | Enum (列舉) | ✔️ | 不適用 | |
float (浮點數) | Float (浮點數) | ✔️ | @db.Float | |
double (雙精度浮點數) | Float (浮點數) | ✔️ | @db.Double | |
smallint (小整數) | Int (整數) | ✔️ | @db.SmallInt | |
smallint unsigned (無符號小整數) | Int (整數) | ✔️ | @db.UnsignedSmallInt | |
mediumint (中整數) | Int (整數) | ✔️ | @db.MediumInt | |
mediumint unsigned (無符號中整數) | Int (整數) | ✔️ | @db.UnsignedMediumInt | |
int (整數) | Int (整數) | ✔️ | @db.Int | |
int unsigned (無符號整數) | Int (整數) | ✔️ | @db.UnsignedInt | |
tinyint (微型整數) | Int (整數) | ✔️ | @db.TinyInt(x) | tinyint(1) 對映到 Boolean,所有其他 tinyint(x) 對映到 Int |
tinyint unsigned (無符號微型整數) | Int (整數) | ✔️ | @db.UnsignedTinyInt(x) | tinyint(1) unsigned 不 對映到 Boolean |
year (年份) | Int (整數) | ✔️ | @db.Year | |
json | Json | ✔️ | @db.Json | 僅在 MySQL 5.7+ 中受支援 |
char (字元) | String (字串) | ✔️ | @db.Char(x) | |
varchar (變長字元) | String (字串) | ✔️ | @db.VarChar(x) | |
tinytext (微型文字) | String (字串) | ✔️ | @db.TinyText | |
text (文字) | String (字串) | ✔️ | @db.Text | |
mediumtext (中型文字) | String (字串) | ✔️ | @db.MediumText | |
longtext (長文字) | String (字串) | ✔️ | @db.LongText | |
set | 不支援 | 暫不支援 | ||
geometry (幾何) | 不支援 | 暫不支援 | ||
point (點) | 不支援 | 暫不支援 | ||
linestring (線串) | 不支援 | 暫不支援 | ||
polygon (多邊形) | 不支援 | 暫不支援 | ||
multipoint (多點) | 不支援 | 暫不支援 | ||
multilinestring (多線串) | 不支援 | 暫不支援 | ||
multipolygon (多邊形) | 不支援 | 暫不支援 | ||
geometrycollection (幾何集合) | 不支援 | 暫不支援 |
內省 將 暫不支援 的原生資料庫型別新增為 Unsupported 欄位。
model Device {
id Int @id @default(autoincrement())
name String
data Unsupported("circle")
}
引擎
如果你使用的 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 pull 和 prisma db push 命令。為了也能執行 prisma migrate 命令,需要授予這些許可權:
mysql -e "GRANT CREATE, DROP, REFERENCES, ALTER ON *.* TO $DB_USER@'%';"