4-3 RBAC角色权限实现:prisma数据库调整(同步、迁移、重置)
概述
本节从数据库层面开始实现 RBAC,包括:设计 Role 和 UserRole 模型,以及掌握 Prisma 数据库迁移的生命周期管理命令。开发阶段使用 db push 快速同步,生产环境则需要使用 migrate 命令进行版本化管理。
Prisma 数据库迁移命令一览
| 命令 | 用途 | 适用环境 | 说明 |
|---|---|---|---|
prisma db push | 将 Schema 变更同步到数据库 | 开发环境 | 快速原型设计,不生成迁移文件 |
prisma migrate dev | 创建新的迁移并应用 | 开发环境 | 生成 SQL 文件,适合版本控制 |
prisma migrate reset | 重置数据库(删除所有数据) | 仅开发环境 | 清空数据库并重新应用所有迁移 |
prisma migrate deploy | 应用所有未执行的迁移 | 生产环境 | 按顺序应用 migration 文件夹中的 SQL |
prisma migrate resolve | 手动标记迁移状态 | 开发/生产 | 解决迁移冲突,支持 --applied 和 --rolled-back |
prisma migrate diff | 对比两个数据库的差异 | 运维 | 比较生产库与开发库的结构差异 |
命令执行流程
开发阶段:
schema.prisma 修改
↓
prisma migrate dev --name <name>
↓
生成 migration/<timestamp>_<name>/migration.sql
↓
自动应用到开发数据库
生产部署:
migration/ 文件夹提交到代码仓库
↓
CI/CD 执行 prisma migrate deploy
↓
按时间戳顺序应用所有未执行的迁移
text
package.json 脚本配置
{
"scripts": {
"db:push": "prisma db push",
"db:reset": "prisma migrate reset",
"db:deploy": "prisma migrate deploy",
"db:migrate": "prisma migrate dev"
}
}
json
RBAC 数据模型设计
新增 Role 模型
// schema.prisma
model Role {
id Int @id @default(autoincrement())
name String @unique
description String?
users UserRole[] @relation("roleUsers")
rolePermissions RolePermission[]
@@map("roles")
}
prisma
新增 UserRole 关联模型
UserRole 是 User 和 Role 之间的多对多关联表,使用联合主键:
model UserRole {
userId Int @map("user_id")
roleId Int @map("role_id")
role Role @relation("roleUsers", fields: [roleId], references: [id])
user User @relation("userRoles", fields: [userId], references: [id])
@@id([userId, roleId]) // 联合主键
@@map("user_roles") // 映射到数据库表名
}
prisma
User 模型关联更新
model User {
id Int @id @default(autoincrement())
username String @unique
password String
// ...其他字段
userRoles UserRole[] @relation("userRoles")
@@map("users")
}
prisma
模型关系图
┌──────────┐ ┌──────────────┐ ┌──────────┐
│ User │ │ UserRole │ │ Role │
├──────────┤ ├──────────────┤ ├──────────┤
│ id (PK) │◄────│ userId (FK) │ │ id (PK) │
│ username │ │ roleId (FK) │────►│ name │
│ password │ │ │ │ desc │
└──────────┘ └──────────────┘ └──────────┘
联合主键: [userId, roleId]
text
迁移实操流程
1. 创建初始迁移
项目首次使用迁移时,需要创建初始 migration:
npx prisma migrate dev --name init
bash
这会在 prisma/migrations/ 目录下生成 <timestamp>_init/migration.sql 文件,包含所有现有模型的建表语句。
2. 开发阶段快速同步
修改 schema 后,使用 db push 快速同步到数据库:
pnpm db:push
bash
此命令会重新生成 Prisma Client 并同步模型结构到远端数据库。
3. 数据库重置
需要清空所有数据并从头开始时:
pnpm db:reset
# 或
npx prisma migrate reset
bash
注意:此命令会删除所有数据,仅在开发环境使用。
4. 创建新迁移
添加 Role 模型后,创建新的迁移:
npx prisma migrate dev --name role
bash
生成带时间戳的迁移文件,同时自动应用到数据库。
5. 选择性应用迁移
# 标记某个迁移为已应用
npx prisma migrate resolve --applied role
# 部署所有迁移
npx prisma migrate deploy
bash
6. 迁移回滚
当某次迁移出错时,可以使用 resolve 回滚:
npx prisma migrate resolve --rolled-back <migration_name>
bash
迁移文件结构
prisma/
├── schema.prisma
└── migrations/
├── 20260501000000_init/
│ └── migration.sql # 初始表结构
├── 20260515000000_role/
│ └── migration.sql # 添加 Role 和 UserRole 表
└── migration_lock.toml
text
生产环境迁移最佳实践
- 版本 1.0 时创建初始迁移:开发完成第一个版本后,基于此时的 schema 创建初始迁移
- 后续变更使用
migrate dev:每次修改 schema 后创建新迁移 - 部署使用
migrate deploy:CI/CD 中执行,自动按顺序应用未执行的迁移 - 迁移文件纳入版本控制:将 migrations 目录提交到 Git
- 测试数据在 1.0 发布时清除:通过
migrate reset重新初始化
下一步
数据库模型中还需要添加 Permission 表和 RolePermission 关联表,用于存储角色与具体模块路由权限的对应关系。
↑