数据库 - prisma
本章学习一下prisma,贴一下prisma的官方文档地址 www.prisma.io/
本章版本号 6.18 ,本章sql类型:mysql
1.安装包和初始化
css
pnpm i prisma @prisma/client -D
npx prisma init
初始化文件之后 生成了 schema.prisma,和 prisma.config.ts
2.修改配置
prisma.config.ts
php
import path from "path";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: path.join("prisma"),
migrations: {
path: "prisma/migrations",
},
engine: "classic",
datasource: {
url: env("DATABASE_URL"),
},
});
schema.prisma
ini
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
.env 添加 DATABASE_URL 配置
ini
mysql://USER:PASSWORD@HOST:PORT/DATABASE?connection_limit=5&socket_timeout=3
3.配置数据库文件
参考目录如下

user.prisma
tsx
model User {
id Int @id @default(autoincrement())
userCode String @unique @map("user_code") @db.VarChar(32)
userName String @map("user_name")
email String
password String @db.VarChar(255)
avatar String?
status UserStatus @default(ACTIVE)
deleted Boolean @default(false)
createdAt DateTime @default(now()) @map("created_at")
createdBy String? @map("created_by") @db.VarChar(32)
updatedAt DateTime? @map("updated_at")
updatedBy String? @map("updated_by") @db.VarChar(32)
deletedAt DateTime? @map("deleted_at")
deletedBy String? @map("deleted_by") @db.VarChar(32)
roles UserRole[]
@@index([deleted])
@@map("users")
}
enum UserStatus {
ACTIVE
INACTIVE
}
类型
参考链接:www.prisma.io/docs/orm/ov...
| Prisma ORM | Mysql | 备注 |
|---|---|---|
| String | VARCHAR(192) | |
| Boolean | BOOLEAN | 其实就是 TINYINT(1) |
| Int | INT | |
| BigInt | BIGINT | |
| Float | DOUBLE | |
| Decimal | DECIMAL(65,30) | |
| DateTime | DATETIME(3) | 不支持0000-00-00 |
| Json | JSON | 支持MySQL5.7+ |
| Bytes | LONGLOB | |
| enum | Enum |
属性
参考链接:www.prisma.io/docs/orm/pr...
| 标识 | 说明 |
|---|---|
| @id @default(autoincrement()) | id 列 |
| @default(false) | 默认值 |
| @db.VarChar(31) | string值 |
| @unique | 唯一索引 |
| @map("created_at") | 列别名 |
| @@unique([authorId, title]) | 联合唯一索引 |
| @@index([deleted]) | 表索引 |
| @@map("users") | 表别名 |
4.命令修改
修改package.json
没有安装dotent-cli的安装一下
pnpm i tsx -D
参考链接 : www.prisma.io/docs/orm/mo...
json
{
"prisma:dev": "dotenv -e .env.development -- npx prisma migrate dev",
"prisma:reset": "dotenv -e .env.development -- npx prisma migrate reset",
"prisma:init": "dotenv -e .env.development -- npx tsx prisma/seed.ts"
}
直接 npm run prisma:dev
5.添加小测
添加seed.ts文件
javascript
import { PrismaClient } from "generated/prisma/client";
import {
PermissionCreateManyInput,
UserCreateManyInput,
} from "generated/prisma/models";
import bcrypt from "bcrypt";
const client = new PrismaClient();
async function main() {
// 首先删除所有现有数据,注意删除顺序以避免外键约束冲突
await client.rolePermission.deleteMany({});
await client.userRole.deleteMany({});
await client.permission.deleteMany({});
await client.role.deleteMany({});
await client.user.deleteMany({});
// 定义权限菜单项
const permissions = [
// 一级菜单
{
permissionName: "系统管理",
permissionCode: "p-system-manage",
path: "/system",
action: "manage",
resourceType: "MENU",
level: 1,
},
// 二级菜单 - 用户管理
{
permissionName: "用户管理",
permissionCode: "p-user-manage",
path: "/system/user",
action: "manage",
resourceType: "MENU",
level: 2,
parentPermissionCode: "p-system-manage",
},
// 用户管理相关API权限
{
permissionName: "用户查询",
permissionCode: "p-user-query",
path: "/api/users",
action: "read",
resourceType: "API",
level: 3,
parentPermissionCode: "p-user-manage",
},
{
permissionName: "用户创建",
permissionCode: "p-user-create",
path: "/api/users",
action: "create",
resourceType: "API",
level: 3,
parentPermissionCode: "p-user-manage",
},
{
permissionName: "用户编辑",
permissionCode: "p-user-update",
path: "/api/users/*",
action: "update",
resourceType: "API",
level: 3,
parentPermissionCode: "p-user-manage",
},
{
permissionName: "用户删除",
permissionCode: "p-user-delete",
path: "/api/users/*",
action: "delete",
resourceType: "API",
level: 3,
parentPermissionCode: "p-user-manage",
},
// 二级菜单 - 角色管理
{
permissionName: "角色管理",
permissionCode: "p-role-manage",
path: "/system/role",
action: "manage",
resourceType: "MENU",
level: 2,
parentPermissionCode: "p-system-manage",
},
// 角色管理相关API权限
{
permissionName: "角色查询",
permissionCode: "p-role-query",
path: "/api/roles",
action: "read",
resourceType: "API",
level: 3,
parentPermissionCode: "p-role-manage",
},
{
permissionName: "角色创建",
permissionCode: "p-role-create",
path: "/api/roles",
action: "create",
resourceType: "API",
level: 3,
parentPermissionCode: "p-role-manage",
},
{
permissionName: "角色编辑",
permissionCode: "p-role-update",
path: "/api/roles/*",
action: "update",
resourceType: "API",
level: 3,
parentPermissionCode: "p-role-manage",
},
{
permissionName: "角色删除",
permissionCode: "p-role-delete",
path: "/api/roles/*",
action: "delete",
resourceType: "API",
level: 3,
parentPermissionCode: "p-role-manage",
},
// 二级菜单 - 权限管理
{
permissionName: "权限管理",
permissionCode: "p-permission-manage",
path: "/system/permission",
action: "manage",
resourceType: "MENU",
level: 2,
parentPermissionCode: "p-system-manage",
},
// 权限管理相关API权限
{
permissionName: "权限查询",
permissionCode: "p-permission-query",
path: "/api/permissions",
action: "read",
resourceType: "API",
level: 3,
parentPermissionCode: "p-permission-manage",
},
{
permissionName: "权限创建",
permissionCode: "p-permission-create",
path: "/api/permissions",
action: "create",
resourceType: "API",
level: 3,
parentPermissionCode: "p-permission-manage",
},
{
permissionName: "权限编辑",
permissionCode: "p-permission-update",
path: "/api/permissions/*",
action: "update",
resourceType: "API",
level: 3,
parentPermissionCode: "p-permission-manage",
},
{
permissionName: "权限删除",
permissionCode: "p-permission-delete",
path: "/api/permissions/*",
action: "delete",
resourceType: "API",
level: 3,
parentPermissionCode: "p-permission-manage",
},
] as PermissionCreateManyInput[];
// 加密密码
const saltRounds = 10;
const adminPassword = await bcrypt.hash("admin@123", saltRounds);
const userPassword = await bcrypt.hash("user@123", saltRounds);
// 定义角色
const roles = [
{
roleName: "超级管理员",
roleCode: "r-super-admin",
},
{
roleName: "普通用户",
roleCode: "r-user",
},
];
// 定义用户
const users = [
{
userCode: "admin",
userName: "管理员",
email: "admin@example.com",
password: adminPassword,
},
{
userCode: "user",
userName: "普通用户",
email: "user@example.com",
password: userPassword,
},
] as UserCreateManyInput[];
// 创建用户
await client.user.createMany({
data: users,
});
// 创建权限
await client.permission.createMany({
data: permissions,
});
// 创建角色
await client.role.createMany({
data: roles,
});
// 用户角色关联
const userRoles = [
{
userCode: "admin",
roleCode: "r-super-admin",
},
{
userCode: "user",
roleCode: "r-user",
},
];
await client.userRole.createMany({
data: userRoles,
});
// 角色权限关联
const rolePermissions = [
// 超级管理员拥有所有权限
...permissions.map((permission) => ({
roleCode: "r-super-admin",
permissionCode: permission.permissionCode,
})),
];
await client.rolePermission.createMany({
data: rolePermissions,
});
}
main().then(() => {
client.$disconnect();
});
直接 npm run prisma:init
这样初始化的一个项目的prisma就好了