背景
一直在用的orm框架是typeorm,最近有一个比较热门的后起之秀prisma,start快到两千了。
本文就是来体验下prisma,主要内容如下:
1、如何使用prisma;
2、一些常见的问题记录(主要是之前使用orm框架的解决方案在prisma上的实现);
3、总结;
使用
1、安装客户端和依赖;
// 客户端 执行一些数据操作,e.g. 生成表,同步表
yarn add @prisma/client
// 依赖
yarn add prisma
2、初始化;
1、创建项目(ts+koa);
2、创建数据库(我用的本地mysql服务作为测试);
3、生成prisma目录, 在根目录下执行 npx prisma init;
3、配置model;
// schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
4、配置数据库连接;
// .env,使用的是本地mysql数据库,数据库名prisma
DATABASE_URL="mysql://root:123456@127.0.0.1:3306/prisma?sslpassword=123456"
5、初始化数据库表;
npx prisma db push
6、crud, e.g.
const prisma = new PrismaClient()
let user = await prisma.user.findUnique({
where: {
id: ctx.request.body.uid,
},
})
更详细的内容请查看我的源码
问题记录
1、如何创建多个.prisma文件;
暂不支持,有issue跟进,目前的解决方案是通过脚本来合并文件;
2、如何创建连接池;
每次实例化prisma/client new PrismaClient() 都会创建连接池,需要使用单例模式或者配合GraphQL使用。e.g.
// 单例模式,配置全局变量使用prisma/client
import { PrismaClient } from "@prisma/client"
let prisma
if (process.env.NODE_ENV === "production") {
prisma = new PrismaClient()
} else {
if (!global.prisma) {
global.prisma = new PrismaClient()
}
prisma = global.prisma
}
export default prisma
// prisma + GraphQL
const prisma = new PrismaClient()
const server = new GraphQLServer({
context: ({ request }) => ({
prisma
request,
}),
resolvers,
typeDefs: __dirname + "/schema.graphql",
});
关联的issue
3、如何写原生sql语句;
使用过orm框架的童鞋比较清楚,sql语句复杂度非常高,很多orm框架并不能完整实现所有的sql语句,有些需求还是需要通过sql语句去实现。
prisma也提供了执行sql语句的方法,有两种方式,executeRaw。区别在于前者用于查询语句,后者用于执行语句。e.g.
// 具体请查看源码
await prisma.$queryRaw`select * from user where id=${ctx.query.id};`
await prisma.$executeRaw`insert into user value(${null}, ${ctx.request.body.email}, ${ctx.request.body.name});`
另也支持unsafe写法(executeRawUnsafe, 不对sql语句处理,可能有注入风险)。
总结
因为之前一直在用typeorm,所以在尝试使用prisma时候有点按照之前orm框架的思维模式来使用,感觉有点不习惯。
我对联表(可能写的不多)没特别的痛感,所以在使用prisma过程中也没感觉到有快感。
暂时不打算在业务中应用,等后面有机会尝试再看下是否有新的体会吧。
参考文档:
1、官方文档: www.prisma.io/docs/gettin…