MySQL/MariaDB
MySQL 数据源连接器将 Prisma ORM 连接到 MySQL 或 MariaDB 数据库服务器。
默认情况下,MySQL 连接器包含一个负责连接到数据库的数据库驱动程序。您可以使用 驱动程序适配器(预览版)通过 Prisma Client 使用 JavaScript 数据库驱动程序连接到数据库。
示例
要连接到 MySQL 数据库服务器,您需要在 Prisma 模式中配置一个 datasource 块
datasource db {
provider = "mysql"
}
datasource 块指定了 mysql 数据源连接器,它用于 MySQL 和 MariaDB。
在 Prisma ORM 7 中,数据库连接 URL 在 prisma.config.ts 中配置。
import { defineConfig, env } from 'prisma/config'
import 'dotenv/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
datasource: {
url: env('DATABASE_URL'),
},
})
此配置使用 环境变量 提供数据库连接 URL。
使用 mariadb 驱动程序
从 v5.4.0 开始,您可以将 Prisma ORM 与 JavaScript 生态系统中的数据库驱动程序(而不是使用 Prisma ORM 的内置驱动程序)一起使用。您可以通过使用 驱动程序适配器 来实现。
对于 MySQL 和 MariaDB,mariadb 是 JavaScript 生态系统中最受欢迎的驱动程序之一。
本节解释了如何将其与 Prisma ORM 和 @prisma/adapter-mariadb 驱动程序适配器一起使用。
1. 安装依赖项
首先,安装 Prisma ORM 的 mariadb 驱动程序适配器
npm install @prisma/adapter-mariadb
2. 使用驱动程序适配器实例化 Prisma Client
现在,当您实例化 Prisma Client 时,您需要将 Prisma ORM 的驱动程序适配器实例传递给 PrismaClient 构造函数。
import 'dotenv/config'
import { PrismaMariaDb } from '@prisma/adapter-mariadb'
import { PrismaClient } from '../generated/prisma/client'
const adapter = new PrismaMariaDb({
host: "localhost",
port: 3306,
connectionLimit: 5
})
const prisma = new PrismaClient({ adapter })
连接详情
连接 URL
以下是 MySQL 连接 URL 所需组件的概述

基本 URL 和路径
以下是使用大写占位符值的基本 URL 和路径结构示例
mysql://USER:PASSWORD@HOST:PORT/DATABASE
以下组件构成数据库的基本 URL,它们始终是必需的
| 名称 | 占位符 | 描述 |
|---|---|---|
| 主机 | 主机 | 数据库服务器的 IP 地址/域名,例如 localhost |
| 端口 | 端口 | 数据库服务器运行的端口,例如 5432(默认是 3306,如果使用 Unix socket 则不带端口) |
| User | 用户 | 数据库用户名,例如 janedoe |
| 密码 | 密码 | 数据库用户的密码 |
| 数据库 | 数据库 | 您要使用的 数据库 名称,例如 mydb |
您必须对特殊字符进行百分比编码。
参数
连接 URL 也可以带参数。下面是上面相同的示例,其中包含三个参数的大写占位符值
mysql://USER:PASSWORD@HOST:PORT/DATABASE?KEY1=VALUE&KEY2=VALUE&KEY3=VALUE
可以使用以下参数
| 参数名称 | 必需 | 默认值 | 描述 |
|---|---|---|---|
connection_limit | 否 | num_cpus * 2 + 1 | 连接池的最大大小(Prisma ORM v6 及更早版本) |
connect_timeout | 否 | 5 | 等待新连接打开的最长时间(秒),0 表示无超时 |
pool_timeout | 否 | 10 | 等待连接池中的新连接的最长时间(秒),0 表示无超时 |
ssl证书 | 否 | 服务器证书的路径。证书路径是 相对于 ./prisma 文件夹解析的 | |
ssl身份 | 否 | PKCS12 证书的路径 | |
ssl密码 | 否 | 用于保护 PKCS12 文件的密码 | |
ssl接受 | 否 | 接受无效证书 | 配置是否检查证书中缺失的值。可能的值:accept_invalid_certs、strict |
套接字 | 否 | 指向包含用于连接的套接字的目录 | |
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 issue 中找到更多上下文。
MySQL 到 Prisma 模式的类型映射
MySQL 连接器将 Prisma ORM 数据模型中的 标量类型 映射到原生列类型,如下所示
另外,请参阅按 Prisma ORM 类型组织的类型映射的 Prisma 模式参考。
从 Prisma ORM 到 MySQL 的原生类型映射
| Prisma ORM | MySQL | 备注 |
|---|---|---|
String | VARCHAR(191) | |
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 | 布尔值 | 在 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 | 支持 | 原生数据库类型属性 | 备注 |
|---|---|---|---|---|
序列 | BigInt | ✔️ | @db.UnsignedBigInt @default(autoincrement()) | |
bigint | BigInt | ✔️ | @db.BigInt | |
bigint unsigned | BigInt | ✔️ | @db.UnsignedBigInt | |
位 | 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 | |
时间戳 | 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 |
年份 | Int | ✔️ | @db.Year | |
json | Json | ✔️ | @db.Json | 仅在 MySQL 5.7+ 中支持 |
字符 | 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 | |
集 | 不支持 | 暂不支持 | ||
几何 | 不支持 | 暂不支持 | ||
点 | 不支持 | 暂不支持 | ||
线串 | 不支持 | 暂不支持 | ||
多边形 | 不支持 | 暂不支持 | ||
多点 | 不支持 | 暂不支持 | ||
多多线串 | 不支持 | 暂不支持 | ||
多多边形 | 不支持 | 暂不支持 | ||
几何集合 | 不支持 | 暂不支持 |
内省会添加目前不支持的原生数据库类型,作为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@'%';"