prisma使用3个月有感

2025-09-23 07:14:35

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

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

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

2024.6.7 更新: 5.15.0 发布,支持拆分配置文件

2024.8.9 更新: 5.18.0 发布,支持uuid(7)。目前,有效值只有 4 和 7,默认值为 4。

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

12345678910async create(data: Prisma.UserCreateInput): Promise { try { data.password = await hashPassword(data.password); return await this.prisma.user.create({ data, }); } catch (e) { throw new HttpExceptionFilter(); } }

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

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

需要自己去implements一下。

123export class CreateUserDto implements Prisma.UserCreateInput {}@ApiBody({ type: () => CreateUserDto })

社区认为值得改进但官方并不重视issue及pr处理不积极

官方仓库prisma/prisma的issue及pr处理速度非常慢,而且很多issue都没有回复,且已经提了的pr也长期不处理。

在issue提出的问题,如果官方认为社区可以解决是会马上被转移至Discussion区的,所以可见接近3k的issue是值得官方来进行解决和说明的。

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

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

createMany,作为ORM,我个人认为这是最核心这个功能,然而在Sqlite中是不支持的,很久的issue了。

createMany is a very worth considering for testing in sqlite development mode #21206

Add the createMany method to SQLite #10710

prisma.model.createMany is not a function #11507

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

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

不支持拆分配置文件。prisma的数据模型设计文件并非.ts,而是自定义的*.prisma。以我正在开发中的项目为例子,目前只设计了62张表,schema.prisma(prisma默认存放表结构的文件)已经800+行。 最新版本已经支持。

Support for splitting Prisma schema into multiple files #2377

只支持@default(uuid())。

Implement nanoid() #18612

Make @default(nanoid()) alphabet configurable #17294

Support ULID · Issue #13679 · prisma/prisma · GitHub

Support UUID v7 · Issue #24079 · prisma/prisma · GitHub5.18.0已支持。Native support for UUIDv7

需要注意的是,截止目前(2024.9.1),jetbrains的prisma插件还不支持uuid(7),其language-server仍然为1.6版本。 最新版本已支持。

1234567891011121314 model User { id String @id @default(uuid()) // defaults to 4 name String}model User { id String @id @default(uuid(4)) // same as above, but explicit name String}model User { id String @id @default(uuid(7)) // will use UUIDv7 instead of UUIDv4 name String}

Bug年久失修

schema.prisma中定义,

12345model Answer { id String @id @default(cuid()) question Question @relation(fields: [questionId], references: [id], onDelete: Cascade) questionId String}

然后在代码中使用

12345678create(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。