1. 说明
Prisma 是一个现代化的开源 ORM(对象关系映射)工具,专为简化数据库操作而设计。它支持多种数据库,包括 PostgreSQL、MySQL等数据库,同时支持migration,维护开发过程中数据库更改引起的混乱。
2. 使用
1. 安装
yarn add prisma @prisma/client
2. 初始化prisma项目
npx prisma init
将生成prisma/schema.prisma与.env文件,
- .env文件可与dotenv配合使用
DATABASE_URL="postgres://postgres:123456@localhost:5432/数据库名称
- schema.prisma用于定义表、数据库连接、数据库类型,
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
}
enum Gender { //定义枚举
MALE
FEMALE
}
model User {
id String @id @unique @default(cuid())
gender Gender
@@map("user")
}
3. 格式化schema.prisma
npx prisma format
4. 创建表
npx prisma create create_user
此时会在schmes生成一份/20250919150203_create_user/migration.sql,文件中会针对provider的类型生成对应的sql
4. 根据prisma生成数据类型
npx prisma generate
5. 生成migration
- 新增用户、密码字段
model User {
id String @id @unique @default(cuid())
username String @db.VarChar(100)
/// @TypeGraphQL.omit(output: true) 查询结果过滤密码
password String @db.VarChar(100)
gender Gender
}
2. 生成migration
npx prisma generate add_username_and_password_for_user
prisma会自动捕获user表新增了password, username字段,并生成对应的sql
6. 更新数据库
npx prisma run
执行的migrations中的sql,同时会生成_prisma_migrations表,记录migration中的执行情况
在node环境中应用
prisma支持express、koa,在项目中推荐koa
1. 安装koa包
yarn add koa @apollo/server @as-integrations/koa typedi http
2. 开启服务
import Container, { Service } from "typedi";
import { ApolloServer } from "@apollo/server";
import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer";
import { createServer } from "http";
const app = new Koa();
const httpServer = createServer({ keepAlive: false }, app.callback());
const server = new ApolloServer({
schema: mergeSchemas({
schemas: [
typeGraphql.buildSchemaSync({
resolvers: [Resolver],
globalMiddlewares: ,// 全局中间件
container: Container,
authChecker: () => boolean, //用户校验
scalarsMap: [{ type: GraphQLScalarType, scalar: DateTimeResolver }],
emitSchemaFile: true,
validate: false
})
]
}),
plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], // 插件
persistedQueries: false,
allowBatchedHttpRequests: true, // 允许批量上传,用于文件上传
formatError: (formattedError: GraphQLFormattedError, error: unknown) => {
return formattedError; //错误处理
}
});
server.start();
startApolloServer().then(async (apolloServer: any) => {
const graphqlMiddleware = koaMiddleware(apolloServer, {
context: async ({ ctx }: { ctx: Koa.Context }) => {
// 补充上下文
}
})
app.use(graphqlMiddleware);
await new Promise<void>((resolve) => httpServer.listen({ port: 8000 }, resolve));
console.log(`🚀 Server ready at http://localhost:8000/graphql`);
})
3.查询
prisma.find({
where: {
name: '',
}
})
4. 原生sql
prisma同时也支持原生sql查询
prisma.$queryRaw`select * from user`
- 变量为空时的场景
import { Prisma } from "@prisma/client";
prisma.$queryRaw`select * from user where username = ${username ? username : Prisma.Empty}`
- sql中使用in
import { Prisma } from "@prisma/client";
prisma.$queryRaw`select * from user where username in ${Prisma.join(username)}`
- sql拼接
import { Prisma } from "@prisma/client";
const sql1 = Prisma.sql`where username = 'admin'`
const sql2 = Prisma.raw(`LIMIT ${take} OFFSET ${skip} `)
prisma.$queryRaw`select * from user ${sql1} ${sql2}`
总结
相比于其他的orm,prisma在灵活性、扩展性要强了很多,由于会根据实体生成数据类型,因此天然支持typescript;
同时还提供了语义化查询界面,使查询只需要在页面上勾选,便可轻松实现sql查询