跳至主要内容

MySQL/MariaDB

MySQL 数据源连接器将 Prisma ORM 连接到 MySQLMariaDB 数据库服务器。

默认情况下,MySQL 连接器包含一个负责连接到数据库的数据库驱动程序。您可以使用 驱动程序适配器 (预览) 使用来自 Prisma Client 的 JavaScript 数据库驱动程序连接到您的数据库。

示例

要连接到 MySQL 数据库服务器,您需要在您的 Prisma 模式 中配置一个 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 套接字时没有端口)
用户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_certsstrict
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 数据库,您必须将 socket 字段作为查询参数添加到连接 URL(而不是将其设置为 URI 的 host 部分)。然后,此参数的值必须指向包含套接字的目录,例如在 Ubuntu 或 Debian 上的 MySQL/MariaDB 的默认安装中使用:mysql://USER:PASSWORD@HOST/DATABASE?socket=/run/mysqld/mysqld.sock

请注意,localhost 是必需的,值本身会被忽略,可以是任何内容。

注意:您可以在此 GitHub 问题 中找到更多上下文。

MySQL 到 Prisma 模式的类型映射

MySQL 连接器如下将 Prisma ORM 数据模型 中的 标量类型 映射到本机列类型

或者,请参阅 Prisma 模式参考 以获取按 Prisma ORM 类型组织的类型映射。

从 Prisma ORM 到 MySQL 的本机类型映射

Prisma ORMMySQL注释
字符串VARCHAR(191)
布尔值BOOLEAN

在 MySQL 中,BOOLEANTINYINT(1) 的同义词。
整数INT
大整数BIGINT
浮点数DOUBLE
十进制数DECIMAL(65,30)
日期时间DATETIME(3)目前,Prisma ORM 不支持 MySQL 中的零日期 (0000-00-00, 00:00:00)
JSON 数据JSON仅在 MySQL 5.7+ 版本中支持
字节LONGBLOB

Prisma ORM 到 MariaDB 的原生类型映射

Prisma ORMMariaDB注释
字符串VARCHAR(191)
布尔值BOOLEAN

在 MariaDB 中,BOOLEANTINYINT(1) 的同义词。
整数INT
大整数BIGINT
浮点数DOUBLE
十进制数DECIMAL(65,30)
日期时间DATETIME(3)
JSON 数据LONGTEXT参见 https://mariadb.com/kb/en/json-data-type/
字节LONGBLOB

原生类型映射

在内省 MySQL 数据库时,数据库类型会根据下表映射到 Prisma ORM

MySQLPrisma ORM支持原生数据库类型属性注释
serial大整数✔️@db.UnsignedBigInt @default(autoincrement())
bigint大整数✔️@db.BigInt
bigint unsigned大整数✔️@db.UnsignedBigInt
bit字节✔️@db.Bit(x)bit(1) 映射到 Boolean - 所有其他 bit(x) 映射到 Bytes
boolean | tinyint(1)布尔值✔️@db.TinyInt(1)
varbinary字节✔️@db.VarBinary
longblob字节✔️@db.LongBlob
tinyblob字节✔️@db.TinyBlob
mediumblob字节✔️@db.MediumBlob
blob字节✔️@db.Blob
binary字节✔️@db.Binary
date日期时间✔️@db.Date
datetime日期时间✔️@db.DateTime
timestamp日期时间✔️@db.TimeStamp
time日期时间✔️@db.Time
decimal(a,b)十进制数✔️@db.Decimal(x,y)
numeric(a,b)十进制数✔️@db.Decimal(x,y)
enumEnum✔️N/A
float浮点数✔️@db.Float
double浮点数✔️@db.Double
smallint整数✔️@db.SmallInt
smallint unsigned整数✔️@db.UnsignedSmallInt
mediumint整数✔️@db.MediumInt
mediumint unsigned整数✔️@db.UnsignedMediumInt
int整数✔️@db.Int
int unsigned整数✔️@db.UnsignedInt
tinyint整数✔️@db.TinyInt(x)tinyint(1) 映射到 Boolean,所有其他 tinyint(x) 映射到 Int
tinyint unsigned整数✔️@db.UnsignedTinyInt(x)tinyint(1) unsigned **不会** 映射到 Boolean
year整数✔️@db.Year
jsonJSON 数据✔️@db.Json仅在 MySQL 5.7+ 版本中支持
char字符串✔️@db.Char(x)
varchar字符串✔️@db.VarChar(x)
tinytext字符串✔️@db.TinyText
text字符串✔️@db.Text
mediumtext字符串✔️@db.MediumText
longtext字符串✔️@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@'%';"