跳到主要內容

MySQL/MariaDB

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

預設情況下,MySQL 聯結器包含一個負責連線到資料庫的資料庫驅動。你可以使用 驅動介面卡(預覽)透過 Prisma Client 使用 JavaScript 資料庫驅動連線到你的資料庫。

示例

要連線到 MySQL 資料庫伺服器,你需要在 Prisma schema 中配置一個 datasource 塊。

schema.prisma
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}

傳遞給 datasource 塊的欄位有:

  • provider:指定 mysql 資料來源聯結器,它既用於 MySQL 也用於 MariaDB。
  • url:指定 MySQL 資料庫伺服器的 連線 URL。在這種情況下,使用環境變數 提供連線 URL。

連線詳情

連線 URL

以下是 MySQL 連線 URL 所需元件的概覽:

Structure of the MySQL connection 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_limitnum_cpus * 2 + 1連線池 的最大大小
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

配置 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 ORMMySQL備註
String (字串)VARCHAR(191)
Boolean (布林)BOOLEAN在 MySQL 中,BOOLEANTINYINT(1) 的同義詞
Int (整數)INT
BigInt (大整數)BIGINT
Float (浮點數)DOUBLE
Decimal (十進位制)DECIMAL(65,30)
DateTime (日期時間)DATETIME(3)目前,Prisma ORM 不支援 MySQL 中的零日期(0000-00-00, 00:00:00
JsonJSON僅在 MySQL 5.7+ 中受支援
Bytes (位元組)LONGBLOB

從 Prisma ORM 到 MariaDB 的原生型別對映

Prisma ORMMariaDB備註
String (字串)VARCHAR(191)
Boolean (布林)BOOLEAN在 MariaDB 中,BOOLEANTINYINT(1) 的同義詞
Int (整數)INT
BigInt (大整數)BIGINT
Float (浮點數)DOUBLE
Decimal (十進位制)DECIMAL(65,30)
DateTime (日期時間)DATETIME(3)
JsonLONGTEXT請參閱 https://mariadb.com/kb/en/json-data-type/
Bytes (位元組)LONGBLOB

原生型別對映

內省 MySQL 資料庫時,資料庫型別將根據下表對映到 Prisma ORM:

MySQLPrisma 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
jsonJson✔️@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 欄位。

schema.prisma
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 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.