跳到主要内容

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@'%';"
© . All rights reserved.