V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
flyingcrp
V2EX  ›  Node.js

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

  •  
  •   flyingcrp · 12 小时 40 分钟前 · 1339 次点击

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

    • update 没有的数据会直接报错(与数据库行为不一致,心智负担+1),如果硬要用需要用自己包装或拓展,然后调入没有 type 的坑

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

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

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

    • 时区的问题,对于查询,写入,始终以 UTC 时区,从而忽略了 db 本身的时区,且 client 无法调整 https://github.com/prisma/prisma/issues/5051

    • model 中的关联关系对于业务侧使用显得特别笨重,比如简单的连表查询,尤其是那种不同业务需要临时或一次性的连表查询需要 Prisma.sql 来进行,如果在复杂则要走 typedsql;但是 typedsql 不支持动态条件,这种场景是业务侧最最最最多的,因此即便就是简单的列表+总条数查询都需要结合 Prisma.sql 来做原生 SQL 的拼接。

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

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

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

    31 条回复    2025-05-16 00:59:32 +08:00
    subframe75361
        1
    subframe75361  
       12 小时 29 分钟前 via Android
    试试 kysely ,sql 的写法。或者用更火但 dx 差一些的 drizzle orm
    yaodong0126
        2
    yaodong0126  
       12 小时 26 分钟前
    😂你还真别说,迷信 prisma 的人多的一腿
    ultimate42
        3
    ultimate42  
       12 小时 23 分钟前
    我是从 typeorm 转到 prisma 的,prisma 确实有不少痛点,时区,联表查嵌套层级深什么的,但感觉开发体验上,prisma 还是要好一点
    857681664
        4
    857681664  
       12 小时 9 分钟前
    同样 delete 一个不存在的数据也会报错,官方解决方案说是用 executeRaw..
    qiubaowei
        5
    qiubaowei  
       12 小时 9 分钟前
    还好我是守旧派 一直用 sequelize
    flyingcrp
        6
    flyingcrp  
    OP
       11 小时 49 分钟前
    @ultimate42 我试了,确实不行。model 中注释都不支持。感觉还是差点意思
    flmn
        7
    flmn  
       11 小时 27 分钟前
    drizzle 比较好
    BeautifulSoap
        8
    BeautifulSoap  
       11 小时 24 分钟前
    也借地方顺便也让大家避坑一个 ORM:千万不要用 drizzle ,千万不要用 drizzle ,千万不要用 drizzle
    Hbisedm
        9
    Hbisedm  
       11 小时 0 分钟前
    drizzle
    asen001
        10
    asen001  
       10 小时 46 分钟前
    @BeautifulSoap drizzle 有什么坑,有个私活项目用 drizzle 开发到一半了,别吓我
    SolidZORO
        11
    SolidZORO  
       10 小时 43 分钟前
    说一个小众 ORM https://sutando.org/ ,底层是 knex ,进可 ORM ,退可 knex RAW 。

    之所以是说而不是推荐,因为实在太小众,推荐的话实在担不起这个责任,只想让更多人知道它。sutando 作者维护不算积极,total 就两人维护,start 几十,但是手感是我用过所有 ORM 里面最好的,基本上做到了 1:1 对标 Laravel 的 Eloquent ,用起来及其优雅。比堪称是 nodejs 届 Laravel 的 adonisjs 自带强耦合的 lucid 还要想像 Eloquent 。

    y1s1 Node 这边的 ORM 真是烂得可以。drizzle 烂。Prisma 烂,typeORM 烂中烂。

    唯一能打一下的是 sequelize ,的确是可靠了,但是及其啰嗦,TS 支持太差(我是说第三方,第一份约等于没有),以及无止境的 beta 让人又爱又恨。
    yandif
        12
    yandif  
       10 小时 35 分钟前
    @BeautifulSoap 同问有啥坑?
    BeautifulSoap
        13
    BeautifulSoap  
       10 小时 25 分钟前
    @asen001 真用了那就用嘛,也不是不能用,反正之前写 drizzle 我是真的火大
    官方文档写得一塌糊涂,看起来很正规但有用的信息基本没多少
    schema 一堆特性不支持,连最基本的 index desc asc, union index 都不支。到最后不光要写 schema 还要自己去写额外的 migration sql
    类型检查基于 schema 定义,如果我 select 的字段里掺杂了动态生成自动的内容(比如 COUNT(*)之类)的话,过类型检查能折腾死人
    执行 raw sql 并且获取到返回值而且要过类型检查比登天都难
    等等等等,反正下次项目里谁跟我说用 drizzle 我跟谁急
    12tall
        14
    12tall  
       10 小时 23 分钟前
    knex 应该是用的最舒服的了,虽然只是一个 builder
    wunonglin
        15
    wunonglin  
       10 小时 22 分钟前
    drizzle +1
    flyingcrp
        16
    flyingcrp  
    OP
       10 小时 14 分钟前
    目前应该是在 typeorm 中暂时不打算出去了。
    prisma 在构建和打包时也会有很多问题。不设置 binary 的话会直接多 30M+的大小。很离谱。
    然后里面还有一个奇怪的地方,当前 prisma 已经让用自定义 output 路径去做 client 的引入。
    但是底层似乎有依赖了 prisma ,这个里面有个 public 文件夹,里面全是一些文档还是啥的。也是三十多 M.
    justdoit123
        17
    justdoit123  
       10 小时 5 分钟前
    也尝试使用 prisma ,说说我觉得的痛点与疑惑,希望有经验的解答下:

    1. prisma 不生成 class ,如何进一步跟 class-validator 以及 swagger 结合?
    2. 不生成 class ,如果我有很简单的 computed field ,就不知道怎么实现。虽然官方有 [Client extension]( https://www.prisma.io/docs/orm/prisma-client/queries/computed-fields#using-a-prisma-client-extension) 方案,但是 extend 后的 model 类型获取不直接。虽然可以通过类型体操获取。
    3. 个人对滥用 DSL 很反感。DB 的 schema 真的到了需要叠一层 DSL 的程度了吗? 我个人认为还没必要,这样做的收益不高。为了“无缝”切换 DB 类型吗?正常项目开发不会频繁切换 DB 类型,况且也无法做到无缝。 想要降低使用 DB 的门槛吗?熟悉一个 DB 真的是后端的基础门槛,你虽然可以暂时欠着,但是终究要还上,借助 DSL 会很被动,学的都是人家嚼碎了喂你的东西。prisma 用 DSL 描述 schema 的理由,我能想到的唯一理由应该就是他们的野心是实现一个跨语言的 ORM 。
    ByteCat
        18
    ByteCat  
       9 小时 58 分钟前
    在用 drizzle ,感觉很爽,可以写类似 sql 的语法,复杂查询很方便
    Hanggi
        19
    Hanggi  
       8 小时 29 分钟前
    感觉楼主还是对 ts 的编程思想理解和 prisma 的使用方法上...有不一致吧。
    技术选型按自身的理解和喜好来就可以了。

    看看 prisma 自己对 typeorm 的对比,有没有吸引自己转战的特性,
    https://www.prisma.io/docs/orm/more/comparisons/prisma-and-typeorm

    至少目前看来 prisma 是趋势,能早点上手就早收益,用不来也没必要强求,毕竟有那么多人还在宣扬不用 orm ,sql 就应该手写,hhh 。
    https://npmtrends.com/prisma-vs-sequelize-vs-typeorm
    Belmode
        20
    Belmode  
       8 小时 27 分钟前
    我就觉得用 Prisma 能省点事,不用写一堆像 TypeOrm 中那样的实体对象,写很多注解
    cutchop
        22
    cutchop  
       6 小时 19 分钟前
    typescript 挺好的,不知道为什么 prisma 要发明新的格式
    rocmax
        23
    rocmax  
       6 小时 2 分钟前 via Android
    @BeautifulSoap
    1. 文档的问题确实存在,过于简略,需要自己摸索
    2.这些都支持啊,我一看还以为这是以前旧帖子呢。drizzle 基本就是把 ts 翻译成 sql ,这种一个关键字就解决的问题怎么会不支持。没有听说过 union index ,你是指复合索引吗,也支持的啊。union 操作倒是不支持是由于类型推断困难,不重视类型安全的可能会支持。
    3. 类型检查当然要基于 schema 定义了,要不咋办? count (*)可以使用 sql<number>标注类型
    4. 同上,你不给类型标注,数据库返回的是 text ,不得按类型 parse 吗。
    rocmax
        24
    rocmax  
       5 小时 54 分钟前 via Android
    @cutchop 跟 drizzle 比起来 prisma 的 schema 确实简单好懂,我一个简单项目 drizzle schema 都快 1000 行了,除了我自己没人能看懂,估计也没人有耐心看完,幸好有 visualizer 。
    rocmax
        25
    rocmax  
       5 小时 50 分钟前 via Android
    @justdoit123 是的,比如 golang:

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

    由于 prisma core 从 rust 改回 ts ,被放弃了
    rocmax
        26
    rocmax  
       5 小时 34 分钟前
    @BeautifulSoap 对不起,上面说的有误,sql<T>`COUNT(*)`类型标注没有用,需要 mapWith 函数
    k9982874
        27
    k9982874  
       5 小时 28 分钟前 via iPad
    用不上那些高大上的 orm 功能,转到了 postgres.is
    楼上推荐的 Kysely ,感觉比较像 gorm ,有空试试
    BeautifulSoap
        28
    BeautifulSoap  
       4 小时 55 分钟前
    @rocmax
    2. 你自己试试看 mysql 的 schema 里能不能指定 asc 或者 desc 的 index 吧。postgresql 可以,但是 mysql 不行的。并且 mysql 的复合索引文档里根本找不到怎么用
    4. 这个你自己亲自写一下就知道了。就最简单的用 drizzle 执行 mysql 的 `show tables` 然后解析出所有表格。保证你一写一个不吱声。官方文档里只写了怎么执行 raw sql 但对怎么获取到 raw sql 的返回值只字不提。最后花了 N 久时间才找到解决办法
    rocmax
        29
    rocmax  
       4 小时 0 分钟前
    @BeautifulSoap
    https://drizzle.run/nx1z72u347hvkyjd0zspe7ki
    这样如何?
    我司从去年初就全面改用 postgresql 了,确实我说的是 postgresql 的情况。
    mysql 的时期用的是 prisma
    rocmax
        30
    rocmax  
       3 小时 39 分钟前
    @BeautifulSoap 我知道为啥对 sql<T>类型标注产生错觉了,好像 COUNT 的返回值类型就是 number ,即便标注了 string 依旧是 number
    https://drizzle.run/lstx39x8scbt8gotd2ndrwhp
    Trim21
        31
    Trim21  
       3 小时 26 分钟前
    现在在用 drizzle ,但是感觉维护者对 mysql 相关的特性不太重视 ...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:26 · PVG 04:26 · LAX 13:26 · JFK 16:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.