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 folder 解析 | |
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 folder
解析 -
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
透過 socket 連線
若要透過 socket 連線到您的 MySQL/MariaDB 資料庫,您必須將 socket
欄位作為查詢參數新增至連線 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 資料模型中的純量類型映射到原生資料行類型,如下所示
或者,請參閱 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
使用者身分執行此操作 (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@'%';"