数据库驱动程序
默认内置驱动程序
Prisma Client 的组件之一是 Query Engine。Query Engine 负责将 Prisma Client 查询转换为 SQL 语句。它使用无需额外设置的内置驱动程序通过 TCP 连接到您的数据库。
自 v6.7.0 起,Prisma ORM 包含 queryCompiler
预览功能。
启用后,您的 Prisma Client 将在生成时不再包含基于 Rust 的查询引擎二进制文件:
generator client {
provider = "prisma-client-js"
previewFeatures = ["queryCompiler", "driverAdapters"]
}
请注意,
queryCompiler
同时需要 driver adapters 预览功能。
驱动适配器
Prisma Client 可以使用 JavaScript 数据库驱动程序通过驱动适配器连接到您的数据库并运行查询。适配器充当 Prisma Client 和 JavaScript 数据库驱动程序之间的转换器。
Prisma Client 将使用 Query Engine 将 Prisma Client 查询转换为 SQL,并通过 JavaScript 数据库驱动程序运行生成的 SQL 查询。
驱动适配器有两种不同的类型
注意:驱动适配器使得使用 Prisma ORM 的应用程序能够进行 edge 部署。
数据库驱动适配器
您可以使用数据库驱动适配器,从 Prisma Client 连接到您的数据库,使用基于 Node.js 的驱动程序。Prisma 维护以下数据库驱动适配器
- PostgreSQL
- SQLite
better-sqlite3
libSQL
(Turso)
Serverless 驱动适配器
数据库提供商,如 Neon 和 PlanetScale,允许您使用 TCP 之外的其他协议连接到数据库,例如 HTTP 和 WebSockets。这些数据库驱动程序针对在 serverless 和 edge 环境中连接数据库进行了优化。
Prisma ORM 维护以下 Serverless 驱动适配器
- Neon(和 Vercel Postgres)
- PlanetScale
- Cloudflare D1
社区维护的数据库驱动适配器
您还可以为您正在使用的数据库构建自己的驱动适配器。以下是社区维护的驱动适配器列表
如何使用驱动适配器
要使用此功能
-
更新您的 schema 中的
previewFeatures
块,以包含driverAdapters
预览功能generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
} -
生成 Prisma Client
npx prisma generate
-
请参阅以下页面,了解更多关于如何在特定数据库提供商中使用特定驱动适配器的信息
关于使用驱动适配器的注意事项
v6.6.0 中新的驱动适配器 API
在 v6.6.0 中,我们引入了一种在使用驱动适配器时实例化 Prisma Client 的简化版本。您现在无需创建驱动程序/客户端的实例再将其传递给驱动适配器,而是可以直接创建驱动适配器(并在需要时将其驱动程序的选项传递给它)。
以下是使用 @prisma/adapter-libsql
适配器的示例
6.6.0 之前
早期版本的 Prisma ORM 要求您先实例化驱动程序本身,然后使用该实例创建 Prisma 驱动适配器。以下是使用 LibSQL 的 @libsql/client
驱动程序的示例
import { createClient } from '@libsql/client'
import { PrismaLibSQL } from '@prisma/adapter-libsql'
import { PrismaClient } from '@prisma/client'
// Old way of using driver adapters (before 6.6.0)
const driver = createClient({
url: env.LIBSQL_DATABASE_URL,
authToken: env.LIBSQL_DATABASE_TOKEN,
})
const adapter = new PrismaLibSQL(driver)
const prisma = new PrismaClient({ adapter })
6.6.0 及之后
自 6.6.0 版本发布以来,您可以直接使用您偏好的 JS 原生驱动程序的选项来实例化驱动适配器。
import { PrismaLibSQL } from '@prisma/adapter-libsql'
import { PrismaClient } from '../prisma/prisma-client'
const adapter = new PrismaLibSQL({
url: env.LIBSQL_DATABASE_URL,
authToken: env.LIBSQL_DATABASE_TOKEN,
})
const prisma = new PrismaClient({ adapter })
驱动适配器不读取 Prisma schema 中的连接字符串
使用 Prisma ORM 的内置驱动程序时,连接字符串会从您 Prisma schema 中 datasource
块的 url
字段读取。
另一方面,使用驱动适配器时,连接字符串需要在驱动适配器初次设置时在您的应用程序代码中提供。以下是针对 pg
驱动程序和 @prisma/adapter-pg
适配器的做法
import { PrismaClient } from '@prisma/client'
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({ connectionString: env.DATABASE_URL })
const prisma = new PrismaClient({ adapter })
请参阅您正在使用的驱动适配器的文档以获取具体的设置说明。
驱动适配器与自定义输出路径
自 Prisma 5.9.0 起,在使用驱动适配器预览功能以及 Prisma Client 的自定义输出路径时,您不能使用相对路径引用 Prisma Client。
假设您在 Prisma schema 中的 output
设置为 ../src/generated/client
generator client {
provider = "prisma-client-js"
output = "../src/generated/client"
}
您应该不这样做,不要相对引用该路径
// what not to do!
import { PrismaClient } from './src/generated/client'
const client = new PrismaClient()
相反,您需要使用链接的依赖项。
- npm
- pnpm
- yarn
npm add db@./src/generated/client
pnpm add db@link:./src/generated/client
yarn add db@link:./src/generated/client
现在,您应该能够使用 db
来引用您生成的客户端了!
import { PrismaClient } from 'db'
const client = new PrismaClient()
驱动适配器与特定框架
Nuxt
将驱动适配器与 Nuxt 结合使用并部署到 edge function 环境,这并非开箱即用,但添加 nitro.experimental.wasm
配置选项可以解决此问题
export default defineNuxtConfig({
// ...
nitro: {
// ...
experimental: {
wasm: true,
},
},
// ...
})