MySQL/MariaDB
MySQL 数据源连接器将 Prisma ORM 连接到 MySQL 或 MariaDB 数据库服务器。
默认情况下,MySQL 连接器包含一个负责连接到数据库的数据库驱动程序。您可以使用 驱动程序适配器 (预览) 使用来自 Prisma Client 的 JavaScript 数据库驱动程序连接到您的数据库。
示例
要连接到 MySQL 数据库服务器,您需要在您的 Prisma 模式 中配置一个 datasource
块。
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
传递到 datasource
块的字段为
连接详细信息
连接 URL
以下是 MySQL 连接 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_limit | 否 | num_cpus * 2 + 1 | 连接池 的最大大小 |
connect_timeout | 否 | 5 | 等待打开新连接的最长时间(以秒为单位),0 表示没有超时 |
pool_timeout | 否 | 10 | 等待从池中获取新连接的最长时间(以秒为单位),0 表示没有超时 |
sslcert | 否 | 服务器证书的路径。证书路径 相对于 ./prisma 文件夹 解析 | |
sslidentity | 否 | PKCS12 证书的路径 | |
sslpassword | 否 | 用于保护 PKCS12 文件的密码 | |
sslaccept | 否 | accept_invalid_certs | 配置是否检查证书中缺少的值。可能的值:accept_invalid_certs 、strict |
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 ORM | MySQL | 注释 |
---|---|---|
字符串 | VARCHAR(191) | |
布尔值 | BOOLEAN
| 在 MySQL 中,BOOLEAN 是 TINYINT(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 ORM | MariaDB | 注释 |
---|---|---|
字符串 | VARCHAR(191) | |
布尔值 | BOOLEAN
| 在 MariaDB 中,BOOLEAN 是 TINYINT(1) 的同义词。 |
整数 | INT | |
大整数 | BIGINT | |
浮点数 | DOUBLE | |
十进制数 | DECIMAL(65,30) | |
日期时间 | DATETIME(3) | |
JSON 数据 | LONGTEXT | 参见 https://mariadb.com/kb/en/json-data-type/ |
字节 | LONGBLOB |
原生类型映射
在内省 MySQL 数据库时,数据库类型会根据下表映射到 Prisma ORM
MySQL | Prisma 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) | |
enum | Enum | ✔️ | 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 | |
json | JSON 数据 | ✔️ | @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
字段的**尚未支持**的原生数据库类型。
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@'%';"