😂😂浪费了 3 天时间尝试在新项目中使用 prisma,最后还是决定回到 typeorm

128 天前
 flyingcrp

兄弟们,prisma 有坑,快跑🏃‍♀️💨💨💨💨💨💨💨💨

https://github.com/prisma/prisma/issues/101421

https://github.com/prisma/prisma/issues/10142#issuecomment-1835279273

https://github.com/prisma/prisma/issues/20128

在遇到上面 1,2 的时候硬着头皮继续,但是遇到 3 的时候彻底让我放弃了它。

提桶跑路了 🏃‍♀️💨💨💨💨💨💨💨

兄弟们,节约时间,原理 prisma

4890 次点击
所在节点    Node.js
48 条回复
Ketteiron
128 天前
cutchop
128 天前
typescript 挺好的,不知道为什么 prisma 要发明新的格式
rocmax
128 天前
@BeautifulSoap
1. 文档的问题确实存在,过于简略,需要自己摸索
2.这些都支持啊,我一看还以为这是以前旧帖子呢。drizzle 基本就是把 ts 翻译成 sql ,这种一个关键字就解决的问题怎么会不支持。没有听说过 union index ,你是指复合索引吗,也支持的啊。union 操作倒是不支持是由于类型推断困难,不重视类型安全的可能会支持。
3. 类型检查当然要基于 schema 定义了,要不咋办? count (*)可以使用 sql<number>标注类型
4. 同上,你不给类型标注,数据库返回的是 text ,不得按类型 parse 吗。
rocmax
128 天前
@cutchop 跟 drizzle 比起来 prisma 的 schema 确实简单好懂,我一个简单项目 drizzle schema 都快 1000 行了,除了我自己没人能看懂,估计也没人有耐心看完,幸好有 visualizer 。
rocmax
128 天前
@justdoit123 是的,比如 golang:

https://github.com/steebchen/prisma-client-go

由于 prisma core 从 rust 改回 ts ,被放弃了
rocmax
128 天前
@BeautifulSoap 对不起,上面说的有误,sql<T>`COUNT(*)`类型标注没有用,需要 mapWith 函数
k9982874
128 天前
用不上那些高大上的 orm 功能,转到了 postgres.is
楼上推荐的 Kysely ,感觉比较像 gorm ,有空试试
BeautifulSoap
128 天前
@rocmax
2. 你自己试试看 mysql 的 schema 里能不能指定 asc 或者 desc 的 index 吧。postgresql 可以,但是 mysql 不行的。并且 mysql 的复合索引文档里根本找不到怎么用
4. 这个你自己亲自写一下就知道了。就最简单的用 drizzle 执行 mysql 的 `show tables` 然后解析出所有表格。保证你一写一个不吱声。官方文档里只写了怎么执行 raw sql 但对怎么获取到 raw sql 的返回值只字不提。最后花了 N 久时间才找到解决办法
rocmax
128 天前
@BeautifulSoap
https://drizzle.run/nx1z72u347hvkyjd0zspe7ki
这样如何?
我司从去年初就全面改用 postgresql 了,确实我说的是 postgresql 的情况。
mysql 的时期用的是 prisma
rocmax
128 天前
@BeautifulSoap 我知道为啥对 sql<T>类型标注产生错觉了,好像 COUNT 的返回值类型就是 number ,即便标注了 string 依旧是 number
https://drizzle.run/lstx39x8scbt8gotd2ndrwhp
Trim21
128 天前
现在在用 drizzle ,但是感觉维护者对 mysql 相关的特性不太重视 ...
ratazzi
127 天前
正在用 prisma 看了这帖子怕了,typeorm 简单试过一下,看到生成的 SQL 之后果断放弃,现在我对 JS 写 CRUD 一点兴趣都没了
flydogs
127 天前
三天时间不算浪费,至少你知道了不适合你现在这个项目。
zieglar
127 天前
@justdoit123 #17
我的做法是新建一个 class 来继承 prisma 对应的实体 class ,在新建的自有 class 的基础上去做各种字段装饰、处理操作
flyingcrp
127 天前
@Hanggi 我确实有可能没有完全理解 prisma 的设计思想。但在业务侧开发中我提到的那些问题,确实是实打实的极大的降低了开发效率和提高了心智负担。如果所有业务都是 CRUD ,prisma 的设计似乎也完全不考虑要实际开发的便利性。最简单的就是 update,delete 没有的数据会直接 Error ,这就引出了多一层 db 和 prisma 的心智负担。这种负担或者说设计让业务侧失去了便利性; model 的 relations 在实际开发中,尤其是 query 场景就几乎不可能把关系定义的完,也不可能依赖这种形式去定义。
flyingcrp
127 天前
@flydogs 谢谢大哥,又被安慰到😂😂
justdoit123
127 天前
@zieglar 那是不是 prisma query 出来的数据,再装载到自己实现的实体 class 上?
BeautifulSoap
127 天前
@rocmax 你的这个写法,当用 mysql 的时候将会见到这样一副情景🤦‍♂️



实际上真正 mysql 下能正常过类型检查并且正确执行的代码差不多这样的,堪称和类型检查还有工具斗智斗勇




至于动态的 count ,我说的不是这种简单情景,比如我想 select 出一个表所有字段,然后再添加一个 count 或者其他动态字段,我必须在 select 中再手动写一遍所有字段(下图 q )。啥,照着官方文档 ...User 这样写?照着官文档写连类型检查都过不去(下图 q2)



说真的,用了这么多 typescript 的包,头一次遇到 drizzle 这种无时无刻不在花时间跟类型检查斗智斗勇的包🤦‍♂️
raphaelsoul
127 天前
不是很喜欢他又自己引入一套 schema 语言 所以尝试了一次就丢弃了。
rocmax
127 天前
@BeautifulSoap 这是两个事情,上面那个 sql<T>的类型标注是给 ts 侧看的不负责处理数据,你要根据实际返回的数据格式来标注给 ts ,数据本身是不用处理的。
下面那个用了 cast 所以没办法推断类型,应该在后面加一个 map With 做处理。
playground 没有 MySQL ,我有空搭个环境试试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1131986

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX