用了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
,这点我觉得非常不错。
1 | async create(data: Prisma.UserCreateInput): Promise<User> { |
除了Prisma.UserCreateInput
,还有Prisma.UserUpdateInput
,Prisma.UserWhereUniqueInput
等等,这些都是prisma自动生成的,非常方便。但是仍然有不完美的地方就是,自动生成的类型无法在swagger中直接使用,
1 | type: () => Prisma.UserUpdateInput }) ({ |
需要自己去implements一下。
1 | export class CreateUserDto implements Prisma.UserCreateInput {} |
社区认为值得改进但官方并不重视
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
了。
prisma
团队以性能问题,一直没有解决,这个功能在我看来是非常基础的功能。开发者也明确说明了不需要在乎性能,就是想做开发测试,但是prisma
却仍然没有支持,这让我非常不解,最后不得不换到了postgres
上。
提出的优秀feat官方并不进行支持
不支持拆分配置文件。最新版本已经支持。prisma
的数据模型设计文件并非.ts
,而是自定义的*.prisma
。以我正在开发中的项目为例子,目前只设计了62
张表,schema.prisma
(prisma
默认存放表结构的文件)已经800+
行。只支持
@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版本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14model 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中定义,
1 | model Answer { |
然后在代码中使用
1 | create(questionId: string, input: AnswerInput) { |
以上,看起来没错,但是, Type ‘string’ is not assignable to type ‘never’ #15946 - @DiogoMarques2003 opened this issue on Oct 24, 2022
最后
希望prisma能够越来越好,但是目前来看,我个人认为prisma还不够成熟,还有很多需要完善的feat。