Prisma 简介:适用于 TypeScript 的现代 ORM
Prisma 是一个适用于 TypeScript 和 Node.js 的现代 ORM(对象关系映射),它从根本上改变了与数据库交互的方式。与 Sequelize 或 TypeORM 等传统 ORM 不同,Prisma 提供了声明式数据模型、自动类型生成和直观的 API。该库支持 PostgreSQL、MySQL、SQLite、SQL Server、MongoDB 和 CockroachDB。
Prisma 的主要目标是使数据库操作安全、高效且便捷。通过与 TypeScript 的集成,您可以在编译阶段获得自动补全和类型检查,从而显著减少运行时错误的数量。Prisma 由三个关键组件组成:
- Prisma Client — 自动生成的数据库客户端
- Prisma Migrate — 迁移管理系统
- Prisma Studio — 用于查看和编辑数据的图形用户界面
安装 Prisma
在 TypeScript 项目中安装 Prisma 通过 npm 完成。首先,创建一个新项目:
mkdir my-prisma-projectcd my-prisma-projectnpm init -y安装 Prisma CLI 和 Prisma Client:
npm install prisma @prisma/client --save在项目中初始化 Prisma:
npx prisma init此命令将创建 prisma 目录(包含 schema.prisma 文件)和用于环境变量的 .env 文件。
快速入门:代码示例
让我们创建一个简单的用户管理应用程序。首先,在 prisma/schema.prisma 中定义模型:
generator client { provider = "prisma-client-js"}
datasource db { provider = "sqlite" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt}
model Post { id Int @id @default(autoincrement()) title String content String? published Boolean @default(false) author User @relation(fields: [authorId], references: [id]) authorId Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt}执行迁移以在 SQLite 中创建表:
npx prisma migrate dev --name init现在,创建一个 index.ts 文件,其中包含使用示例:
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() { // 创建用户 const user = await prisma.user.create({ data: { email: 'alice@example.com', name: 'Alice', posts: { create: { title: 'Hello World' } } } }) console.log('Created user:', user)
// 获取所有用户及其帖子 const users = await prisma.user.findMany({ include: { posts: true } }) console.log('All users:', JSON.stringify(users, null, 2))}
main() .catch(e => console.error(e)) .finally(async () => await prisma.$disconnect())运行代码:
npx ts-node index.tsPrisma Client 的主要方法
1. findUnique
功能: 根据唯一标识符(id、email 等)查找单条记录。
参数:
where— 包含搜索条件的对象(必填)include— (可选)用于包含关联模型select— (可选)用于选择特定字段
示例:
const user = await prisma.user.findUni