Prisma 是一个现代化的 ORM(对象关系映射)工具,能够帮助开发者以一种简单、高效且类型安全的方式操作数据库。它支持多种数据库,如 PostgreSQL、MySQL、SQLite、SQL Server 和 MongoDB(通过 Prisma Client 连接)。 Prisma 提供了三大主要工具:
Prisma Client:用于与数据库交互的 API。
Prisma Migrate:用于数据库迁移和版本控制。
Prisma Studio:一个图形化界面,用于直接与数据库交互和查看数据
初始化 npm install prisma --save-dev
npm install @prisma/client
//注意一定要和prisma一个版本npx prisma init
配置数据库 1 2 3 4 5 6 7 8 datasource db { provider = "postgresql" // 或 "mysql", "sqlite", "sqlserver" 等 url = env("DATABASE_URL") } generator client { provider = "prisma-client-js" }
设置prisma项目: Prisma 数据模型 在 Prisma 中,模型代表了数据库中的表结构。你可以在 schema.prisma 文件中定义一个或多个模型。每个模型都由字段构成。 常用类型:
String:字符串类型
Int:整数类型
Float:浮动类型
Boolean:布尔类型
DateTime:日期时间类型 特殊字段:
@id:主键。
@unique:指定字段唯一。
@default:字段的默认值。
@relation:表示外键关系。
@updatedAt:自动更新字段的时间戳。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 model User { id Int @id @default(autoincrement()) name String email String @unique posts Post[] } model Post { id Int @id @default(autoincrement()) title String content String? published Boolean @default(false) authorId Int author User @relation(fields: [authorId], references: [id]) }
安装和配置 Prisma 后,生成 Prisma Client 来与数据库交互。 npx prisma generate
Prisma Migrate 和数据库迁移 Prisma 提供了 Prisma Migrate 工具来处理数据库的迁移,保持数据模型和数据库结构同步。
创建迁移文件 当你修改了 schema.prisma 中的模型后,需要生成和应用迁移文件。 创建迁移文件:npx prisma migrate dev --name init
这将生成数据库迁移文件,并将迁移应用到数据库。 查看迁移历史npx prisma migrate status
数据库重置: 如果你想要重置数据库:npx prisma migrate reset
语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 // 查询所有用户 const users = await prisma.user.findMany(); // 根据用户 ID 查询单个用户 const user = await prisma.user.findUnique({ where: { id: 1, }, include: { posts: true, // 可以使用 include 来包含相关的关联表数据。例如,查询用户及其所有的文章。 }, select: { name: true, email: true, // 只返回 name 和 email 字段 }, }); // 创建一个新的用户 const newUser = await prisma.user.create({ data: { name: 'Alice', email: 'alice@example.com', }, }); // 也可以在创建数据时同时创建关联的其他数据。 const userWithPost = await prisma.user.create({ data: { name: 'Bob', email: 'bob@example.com', posts: { create: { title: 'My first post', content: 'This is my first post!', }, }, }, }); // 更新用户的名字 const updatedUser = await prisma.user.update({ where: { id: 1, }, data: { name: 'John Doe Updated', }, }); console.log(updatedUser); // 更新带有关联关系的数据,某个用户的文章内容 const updatedPost = await prisma.post.update({ where: { id: 1, // 假设文章 ID 为 1 }, data: { content: 'Updated content of the post', }, }); console.log(updatedPost); // 删除一条用户记录 const deletedUser = await prisma.user.delete({ where: { id: 1, }, }); console.log(deletedUser); // 删除所有已发布的文章 const deletedPosts = await prisma.post.deleteMany({ where: { published: true, }, }); console.log(deletedPosts); // 获取用户数量 const userCount = await prisma.user.count(); // 获取第一页的 5 个用户(假设每页显示 5 个用户) const users = await prisma.user.findMany({ skip: 0, take: 5, });
transaction方法 允许你在一个事务中执行多个操作,确保要么所有操作都成功,要么都失败。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 const result = await prisma.$transaction([ prisma.user.create({ data: { name: 'Charlie', email: 'charlie@example.com', }, }), prisma.post.create({ data: { title: 'Charlie\'s Post', content: 'This is Charlie\'s first post.', authorId: 1, // 假设这个用户 ID 为 1 }, }), ]); console.log(result);