Prisma 是一个现代化的 ORM(对象关系映射)工具,能够帮助开发者以一种简单、高效且类型安全的方式操作数据库。它支持多种数据库,如 PostgreSQL、MySQL、SQLite、SQL Server 和 MongoDB(通过 Prisma Client 连接)。
Prisma 提供了三大主要工具:

  1. Prisma Client:用于与数据库交互的 API。
  2. Prisma Migrate:用于数据库迁移和版本控制。
  3. 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);