V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yodhcn
V2EX  ›  程序员

不限编程语言,你认为哪个 ORM 最好用?

  •  2
     
  •   yodhcn ·
    yodhcn · 2022-07-15 13:49:57 +08:00 · 17268 次点击
    这是一个创建于 896 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用过一段 nodejs 的 prisma,CURD 确实很爽,但麻烦一点的查询就只能手写 SQL 了,因为 prisma 这个框架不提供底层的 query builder ,最后还是换回了 knex 这个 query builder 一把梭。

    我想了解一下其它编程语言都有哪些好用的 ORM ,哪些 feature 让你选择这个 ORM ?

    听说过 laravel 的 Eloquent 很好用,但不知道 php 现在 Type Hints 发展的怎么样,有没有像 typescript 一样被广泛应用,因为现在大部分常用的 npm 包都有官方或第三方 typescript 类型注释支持。

    第 1 条附言  ·  2022-07-15 14:23:21 +08:00
    看到诸位都在复读 Rails ,Google 了一下,这是一个曾经很流行的框架,后面的很多 web 框架都有借鉴它,但在我印象里,至少在国内 ruby 并不流行?
    而且用过了 typescript 后,我现在更偏好 强类型 /有类型注释 的动态语言。
    144 条回复    2022-07-22 09:33:38 +08:00
    1  2  
    VincentWang
        1
    VincentWang  
       2022-07-15 13:53:52 +08:00   ❤️ 4
    JPA / Hibernate
    jiulang
        2
    jiulang  
       2022-07-15 13:54:26 +08:00   ❤️ 1
    当然 efcore 最好用
    masterclock
        3
    masterclock  
       2022-07-15 13:54:48 +08:00   ❤️ 2
    scala doobie/quill
    hervey0424
        4
    hervey0424  
       2022-07-15 13:54:49 +08:00   ❤️ 1
    efcore
    terranboy
        5
    terranboy  
       2022-07-15 13:54:50 +08:00   ❤️ 1
    难道你要因为哪个 orm 好用再去选择语言? 熟悉哪个语言就用哪个语言的 orm 我觉得现代的 orm 都差不多
    lululau
        6
    lululau  
       2022-07-15 13:56:49 +08:00   ❤️ 21
    “不是我针对谁,我是说,在座的各位都是垃圾”

    —— Rails Active Record
    NPC666
        7
    NPC666  
       2022-07-15 13:56:50 +08:00 via Android   ❤️ 1
    FreeSQL
    wangkun025
        8
    wangkun025  
       2022-07-15 13:57:31 +08:00   ❤️ 1
    难道不是祖师爷 Rails 吗?
    xiaket
        9
    xiaket  
       2022-07-15 13:59:22 +08:00
    Django
    yodhcn
        10
    yodhcn  
    OP
       2022-07-15 14:00:08 +08:00
    @terranboy #5 我觉得现代的编程语言也差不多... 而且我也没有对哪一编程语言特别熟悉,现在还是面向 stackoverflow 编程
    pepesii
        11
    pepesii  
       2022-07-15 14:02:01 +08:00
    rails 呀
    ifdef
        12
    ifdef  
       2022-07-15 14:02:42 +08:00
    typeorm 支持 query builder
    qichunren
        13
    qichunren  
       2022-07-15 14:03:04 +08:00
    “不是我针对谁,我是说,在座的各位都是垃圾”

    —— Rails Active Record
    deepall
        14
    deepall  
       2022-07-15 14:04:33 +08:00
    “不是我针对谁,我是说,在座的各位都是垃圾”

    —— Rails Active Record
    gam2046
        15
    gam2046  
       2022-07-15 14:20:13 +08:00
    我觉得 ORM 能提供数据库类型到编程语言类型的转换功能就足够了。手写 SQL 无论如何都跑不掉,既然跑不掉都自己也没关系。
    fo2w
        16
    fo2w  
       2022-07-15 14:20:23 +08:00
    “不是我针对谁,我是说,在座的各位都是垃圾”

    —— Rails Active Record
    yodhcn
        17
    yodhcn  
    OP
       2022-07-15 14:22:57 +08:00
    看到诸位都在复读 Rails ,Google 了一下,这是一个曾经很流行的框架,后面的很多 web 框架都有借鉴它,但在我印象里,至少在国内 ruby 并不流行?
    而且用过了 typescript 后,我现在更偏好 强类型 /有类型注释 的动态语言
    FightPig
        18
    FightPig  
       2022-07-15 14:23:16 +08:00
    Rails 的 ActiveRecord
    haolongsun
        19
    haolongsun  
       2022-07-15 14:26:14 +08:00
    Django
    masterclock
        20
    masterclock  
       2022-07-15 14:32:01 +08:00
    ORM 怎么着也得强类型、静态类型吧 [doge]
    liuhan907
        21
    liuhan907  
       2022-07-15 14:43:24 +08:00
    efcore ,没别的。
    mizuhashi
        22
    mizuhashi  
       2022-07-15 14:44:05 +08:00 via iPhone
    rails 的关键是 scope 是一种代数,可以自由组合,一般的 query builder 没这功能。另外 rails 的路由是一个有限自动机,而不是别的那样一个正则列表遍历。
    bthulu
        23
    bthulu  
       2022-07-15 14:45:56 +08:00
    efcore 好用个屁, 批量更新都没出来, 还要 7.0 版才出
    bthulu
        24
    bthulu  
       2022-07-15 14:48:02 +08:00
    就是那种最简单的, update xxx set xx=xx where xx=xx, efcore 都搞不定, 要先通过 where xx=xx 全部查出来, 再循环修改完成后, 再 saveChanges.
    详见 https://github.com/dotnet/efcore/issues/795
    panlatent
        25
    panlatent  
       2022-07-15 14:49:33 +08:00
    如果需要用到框架,那有一点需要考虑:ORM 跟框架的适配度,这点一般框架内置的 ORM 都比较优秀。需要考虑的是否需要支持 SQL Builder 。还有就是怎样使用 ORM , 是只用来跟数据库打交道还是贯穿整个应用,这些对 ORM 的要求肯定不一样。

    一般都是选定语言再去比较 ORM , 全语言的话,好用程度应该是动态类型语言 > 静态类型语言, 脚本语言 > 编译语言,建模能力强,语法糖多的 > 语法简单、设施少的语言。
    themostlazyman
        26
    themostlazyman  
       2022-07-15 14:56:20 +08:00
    MyBatis-Plus
    Cyanhall
        27
    Cyanhall  
       2022-07-15 14:57:48 +08:00   ❤️ 2
    Python 我选 SQLAlchemy

    Golang 我选 Ent
    konnnnn
        28
    konnnnn  
       2022-07-15 14:58:07 +08:00
    ecto
    hingbong
        29
    hingbong  
       2022-07-15 15:01:19 +08:00
    jvm 的 JOOQ 吧
    ByteCat
        30
    ByteCat  
       2022-07-15 15:01:37 +08:00
    Hibernate
    wanguorui123
        31
    wanguorui123  
       2022-07-15 15:02:41 +08:00
    NHibernate
    pengtdyd
        32
    pengtdyd  
       2022-07-15 15:04:24 +08:00
    prisma
    nine
        33
    nine  
       2022-07-15 15:08:37 +08:00
    ORM 肯定是 Rails 了,其他语言根本抄不来的,原因就是 Ruby 的语言特性。
    Rails 后端开发体验,对任何语言框架都是秒杀。(不含 js )

    Rails 仿体最好的是 Elixir 的 Phoniex ,性能出众,然而语言太小众了,生产场合基本不会选择他。
    XCFOX
        34
    XCFOX  
       2022-07-15 15:10:42 +08:00   ❤️ 2
    https://mikro-orm.io/
    TypeScript 的 Mikro Orm 真的很不错
    ✅ 类型安全
    ✅ 隐式事务
    ✅ 使用 TypeScript 的 class 和装饰器定义 POJO
    ✅ 超强的 Query Builder (内置 knex )
    chrisia
        35
    chrisia  
       2022-07-15 15:11:36 +08:00
    ActiveRecord
    XCFOX
        36
    XCFOX  
       2022-07-15 15:15:15 +08:00
    prisma 的问题是它使用自己的一套 DDL(Prisma schema) 去定义 POJO ,而它的 DDL 又不如 TypeScript 好用:无法继承、无法 export ,无法和 class-validator 等库共用。
    wellerman
        37
    wellerman  
       2022-07-15 15:34:52 +08:00
    laravel Eloquent + migration 又快又好
    james2013
        38
    james2013  
       2022-07-15 15:47:38 +08:00
    MyBatis-Plus
    iwdmb
        39
    iwdmb  
       2022-07-15 15:51:16 +08:00
    Rails ActiveRecord
    时代的眼泪
    wxlwsy
        40
    wxlwsy  
       2022-07-15 15:54:01 +08:00
    我目前用的是 mybatis,用法是这样的:
    1 数据库的手动写.
    2 用 maven 插件 生成模板类 ,不关心内生成的 java 是啥牛鬼蛇神,反正数据库咋样代码都是有的,然后打成 jar
    3 项目依赖刚才生产 jar, 然后写个 Dao 就用 mybatis dynamic SQL. 可以不用手写 sql 了.......
    4 程序只操作 DAO.不关心后面的事情.

    实际上最简单的就是手写 sql, 但是手写 sql 最大的问题是数据库变了,编译器检查不了问题,因为那是 String. 完全用 java 的话,重新打包,字段变量马上报警(如果数据库新增字段除外).
    zzf
        41
    zzf  
       2022-07-15 16:17:39 +08:00
    ecto
    jininij
        42
    jininij  
       2022-07-15 16:29:57 +08:00 via iPhone   ❤️ 3
    yii2 的 ActiveRecord ,虽然不写 PHP 已经很多年,但还是很怀念这个 ORM 。我用过最舒服的 orm 没有之一。外加我自己实现的增强 gii ,成为我的舒适区了。后来写 js ,写 python ,写 java ,用什么 ORM 都觉得浑身不舒服。
    87B3F508
        43
    87B3F508  
       2022-07-15 16:30:05 +08:00
    Jooq 好用
    Baloneo
        44
    Baloneo  
       2022-07-15 16:31:46 +08:00
    Peewee
    IMengXin
        45
    IMengXin  
       2022-07-15 16:32:41 +08:00
    目前在用的:SqlSugar
    zxCoder
        46
    zxCoder  
       2022-07-15 16:38:34 +08:00
    不都一样吗,没啥大区别
    StarkWhite
        47
    StarkWhite  
       2022-07-15 17:11:12 +08:00
    graphql 了解一下。都 9102 年了,大家有没有用上 Facebook 出的 GraphQL ?
    https://v2ex.com/t/589138
    flowerains
        48
    flowerains  
       2022-07-15 17:12:10 +08:00
    @jininij 俺也用过 yii ,确实挺怀念 activeRecord 的,可能是其他的 thinkphp 的 orm 太垃了
    StarkWhite
        49
    StarkWhite  
       2022-07-15 17:17:00 +08:00
    @bthulu 这也太拉了吧😂
    lancelock
        50
    lancelock  
       2022-07-15 17:19:01 +08:00
    freesql
    haolongsun
        51
    haolongsun  
       2022-07-15 17:19:21 +08:00
    另外也安利一下 rust 下的 sea-orm.
    Lattez
        52
    Lattez  
       2022-07-15 17:20:15 +08:00
    sqlalchemy
    ll5270
        53
    ll5270  
       2022-07-15 17:23:00 +08:00
    django
    shyling
        54
    shyling  
       2022-07-15 17:36:37 +08:00
    activerecord 啊。。
    learningman
        55
    learningman  
       2022-07-15 17:38:41 +08:00 via Android
    @StarkWhite graphql 是传输协议,又不是 orm
    LeegoYih
        56
    LeegoYih  
       2022-07-15 17:54:28 +08:00
    Java:JPA (实名抵制 MyBatis 和三流插件 MyBatis-Plus ,本质上 ORM 都不算)
    Ruby:Rails (众多框架“借鉴”的对象)
    Python:SQLAlchemy
    Go:没一个好用的,受限于语言本身
    moell
        57
    moell  
       2022-07-15 18:00:04 +08:00
    Eloquent ORM
    lp7631010
        58
    lp7631010  
       2022-07-15 18:11:11 +08:00
    基本上 php laravel 用起来都不怎么需要去拼写 sql, orm 起码能完成日常 95%以上操作,动态语言搞 orm 是天生的优势
    233373
        59
    233373  
       2022-07-15 18:17:55 +08:00
    Django
    qfdk
        60
    qfdk  
       2022-07-15 18:20:31 +08:00 via iPhone
    objection.js
    min
        61
    min  
       2022-07-15 18:26:02 +08:00
    ef
    frodez
        62
    frodez  
       2022-07-15 18:29:54 +08:00
    rust 的 sqlx ,不过不是 orm 级别的库。
    angelface
        63
    angelface  
       2022-07-15 18:46:14 +08:00
    要说写的爽, 那 Rails 的 AR 真的是无人能出其右。
    干净利索,非常自然
    kingjpa
        64
    kingjpa  
       2022-07-15 18:48:07 +08:00
    静态语言的 orm 就不要拿来说了,和动态语言比 就是幼稚园和大学生的差距。
    反过来比性能,角色互换
    evlos
        65
    evlos  
       2022-07-15 18:48:29 +08:00 via iPhone
    ActiveRecord
    lovepplforever
        66
    lovepplforever  
       2022-07-15 18:56:51 +08:00
    Rails 的 ActiveRecord 是最屌的
    WispZhan
        67
    WispZhan  
       2022-07-15 19:56:36 +08:00 via Android
    没人提 groovy 的 grails 啊,不过没错看名字就知道是抄的 rails
    wuhaoworld
        68
    wuhaoworld  
       2022-07-15 20:05:08 +08:00
    必须得是 Laravel 下的 Eloquent ORM
    zorui
        69
    zorui  
       2022-07-15 20:30:00 +08:00
    c# LINQ
    zoharSoul
        70
    zoharSoul  
       2022-07-15 20:46:34 +08:00
    mybatis, 喜欢这种写 sql 的
    ychost
        71
    ychost  
       2022-07-15 20:51:49 +08:00
    EntityFramework 配合 C# 的 Linq 是最好用的,Linq YYDS
    lkk
        72
    lkk  
       2022-07-15 20:54:40 +08:00
    Ruby 在中国不流行大概是因为它名字取的不好,弱逼。
    youngce
        73
    youngce  
       2022-07-15 21:10:19 +08:00
    django
    Saxton
        74
    Saxton  
       2022-07-15 21:13:21 +08:00
    @LeegoYih 如果复杂一点的需求 JPA 真的很难吃开的,最终代码充实着各种拼接。
    varzy
        75
    varzy  
       2022-07-15 21:29:29 +08:00
    Laravel 的 Eloquent ORM 。说实话我几乎不会写 sql ,只有 Laravel 的 Eloquent ORM 能做到让我一行 sql 都不写把项目做出来。。。。
    CookCoder
        76
    CookCoder  
       2022-07-15 21:30:32 +08:00
    PHP Laravel ORM
    rajab
        77
    rajab  
       2022-07-15 21:34:55 +08:00 via Android
    ebean
    ostholz
        78
    ostholz  
       2022-07-15 21:35:41 +08:00
    @lululau
    sequel 表示不服
    zhouyg
        79
    zhouyg  
       2022-07-15 22:01:49 +08:00
    好奇 OP 说的“麻烦一点的查询”是怎么样的,基于 prisma 关系的查找为啥搞不定呢
    dqzcwxb
        80
    dqzcwxb  
       2022-07-15 22:05:07 +08:00   ❤️ 1
    tkmapper,兼容原生 mybatis 且支持多种数据库
    你爱手写 sql 就手写,你爱用 jpa 语法就 jpa 语法一切自由
    Features
        81
    Features  
       2022-07-15 22:05:51 +08:00
    Eloquent ORM 懒人福音
    xgdgsc
        82
    xgdgsc  
       2022-07-15 22:06:55 +08:00 via Android
    对 Julia 感兴趣的话可以看下 PostgresORM.jl 和 Searchlight.jl ,目前可能不是最完备的,但对你参与开发可能最友好
    Rache1
        83
    Rache1  
       2022-07-15 22:11:02 +08:00
    没体验过 ROR 的,但是口碑一直挺不错的样子,用了其他语言的蹩脚 ORM 后,还是觉得 Laravel Eloquent 好用

    gotounix
        84
    gotounix  
       2022-07-15 22:12:39 +08:00   ❤️ 1
    SQLAlchemy ,MyBatis 这种半自动的感觉不伦不类。
    jarontai
        85
    jarontai  
       2022-07-15 22:26:41 +08:00 via iPhone
    巧了,最近我们也开始用 TS 的 orm ,选的是 MikroOrm ,支持 mongo 和 mysql ,支持 query builder ,底层也应该有用 knex ,还没有深度使用但感觉良好
    gowk
        86
    gowk  
       2022-07-15 22:40:06 +08:00
    我站 Entity Framework
    6167
        87
    6167  
       2022-07-15 23:09:54 +08:00
    sqlalchemy
    815979670
        88
    815979670  
       2022-07-15 23:28:36 +08:00
    我投 Yii2 一票,本身会的语言不多 PHP 然后会写一点 GO ,Go 的话 有接触 GORM ,PHP 的话 主流的框架基本都用过,但感觉最舒服只有 Yii2 的 ORM
    afewok
        89
    afewok  
       2022-07-15 23:59:23 +08:00
    手写 SQL 才是最简单,最好用的
    runliuv
        90
    runliuv  
       2022-07-16 00:04:56 +08:00   ❤️ 1
    “不是我针对谁,我是说,在座的各位都是垃圾”
    -- C#.NET Entity Framework.
    yedanten
        91
    yedanten  
       2022-07-16 00:30:01 +08:00 via Android
    PHP Laravel Eloquent 是真的好用,完完全全,0 心智负担
    lanlanye
        92
    lanlanye  
       2022-07-16 00:51:08 +08:00
    如果想要代码代替手写 SQL 的那种 Builder 的话,SQLAlchemy 不错,基本能写 SQL 的都可以写 Python 实现,虽然写起来跟直接写 SQL 也没啥区别。
    如果是 Active Record 那种简单需求的话,毫无疑问是 Rails 的体验秒杀其他工具。
    Leviathann
        93
    Leviathann  
       2022-07-16 01:06:27 +08:00
    快 100 楼了没有一行代码展示是怎么好用的
    maocat
        94
    maocat  
       2022-07-16 01:52:13 +08:00 via iPhone
    Python 的 mongoengine ,真的好用
    lazywen
        95
    lazywen  
       2022-07-16 02:46:43 +08:00 via Android
    Rails ,Django 都很顺手,还有 jetbrains 出的 exposed 也挺好用的,另外 jpa 的状态管理巨坑,依赖数据库强一致性状态的程序慎用,crud 无所谓
    StarkWhite
        96
    StarkWhite  
       2022-07-16 02:59:30 +08:00
    @Leviathann 坐等代码展示哈哈
    StarkWhite
        97
    StarkWhite  
       2022-07-16 03:00:24 +08:00
    我记得阿里出了个 orm ,好像叫 fluentmybatis
    mind3x
        98
    mind3x  
       2022-07-16 05:38:53 +08:00
    居然没人提 Rust 的 Diesel: https://diesel.rs/
    * 强类型安全
    * 代码生成
    * 几乎零额外开销

    可以说是完美。
    skinny
        99
    skinny  
       2022-07-16 07:38:45 +08:00
    @bthulu 对,删除操作也是,得先查询再删除,感觉特别傻逼,稍微复杂点还得手写 SQL 。还有动态添加 ORDERBY 之类也是难用。
    gongquanlin
        100
    gongquanlin  
       2022-07-16 09:04:12 +08:00   ❤️ 3
    用了 laravel 的 orm 之后现在转 java ,觉着 java 的 orm 都和 shi 一样难用,还得复写 sql 。就算 mybatis plus 又如何,唉
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 00:44 · PVG 08:44 · LAX 16:44 · JFK 19:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.