prisma使用3个月有感

用了3个月的prisma,作为和TypeOrm可以说占据了大部分的node后端orm份额,但实际我个人用起来,虽然在参数类型上比较方便,但其他还有值得改进的点,但官方给人的感觉就很傲慢,就这个态度,在我看来目前还称不上下一代ORM

因为本人主要做前端开发,写后端只是顺带,所以一定会有不了解的地方。以下为个人使用过程中遇到的,仅作记录。

  • 2024.4.21 更新: 5.12.0 发布,终于,sqlite支持了createMany方法。

不错的点

提供操作的类型可以直接使用

比如,我想插入一条user数据,我可以直接使用Prisma.UserCreateInput,而不需要自己定义一个interface,这点我觉得非常不错。

1
2
3
4
5
6
7
8
9
10
async create(data: Prisma.UserCreateInput): Promise<User> {
try {
data.password = await hashPassword(data.password);
return await this.prisma.user.create({
data,
});
} catch (e) {
throw new HttpExceptionFilter();
}
}

除了Prisma.UserCreateInput,还有Prisma.UserUpdateInputPrisma.UserWhereUniqueInput等等,这些都是prisma自动生成的,非常方便。但是仍然有不完美的地方就是,自动生成的类型无法在swagger中直接使用,

1
2
@ApiBody({ type: () => Prisma.UserUpdateInput })
// error TS2339: Property 'UserCreateInput' does not exist on type 'typeof Prisma'.

需要自己去implements一下。

1
2
3
export class CreateUserDto implements Prisma.UserCreateInput {}

@ApiBody({ type: () => CreateUserDto })

社区认为值得改进但官方并不重视

核心功能缺失

prisma 5.12.0 版本,sqlite已经支持createMany方法。猜测一下,多半是因为其竞品drizzle以及cloudflare D1正式发布的原因

我开始的时候使用SQLite进行开发,但是在使用过程中发现prismaSqlite支持非常不完善,甚至可以说是部分功能完全不可用,比如说:

prisma团队以性能问题,一直没有解决,这个功能在我看来是非常基础的功能。开发者也明确说明了不需要在乎性能,就是想做开发测试,但是prisma却仍然没有支持,这让我非常不解,最后不得不换到了postgres上。

提出的优秀feat官方并不进行支持

Bug年久失修

  • schema.prisma中定义,
1
2
3
4
5
model Answer {
id String @id @default(cuid())
question Question @relation(fields: [questionId], references: [id], onDelete: Cascade)
questionId String
}

然后在代码中使用

1
2
3
4
5
6
7
8
create(questionId: string, input: AnswerInput) {
return this.prisma.answer.create({
data: {
...input,
questionId,
},
});
}

以上,看起来没错,但是, Type ‘string’ is not assignable to type ‘never’ #15946 - @DiogoMarques2003 opened this issue on Oct 24, 2022

最后

希望prisma能够越来越好,但是目前来看,我个人认为prisma还不够成熟,还有很多需要完善的feat。