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

Rust 两次入门后,尝试写一个 web 项目,懵逼中~

  •  
  •   5261 · 16 天前 · 4374 次点击

    尝试多次入门后,用了以下一些框架

    axum:web framwork sqlx:sqlboy

    写着写着感觉用 rust 写 web 项目总感觉哪里味不对,一直在反思这 rust 写 web 应用真是适合吗?

    就目前 orm 框架 sqlx 、seaorm 、diesel 都还在讨论哪个牛逼~

    不像 Java ,mybatis 用起来那么爽~ 我既想要 orm 的字段映射到对象,也想要自定义查询的灵活~

    58 条回复    2025-04-10 12:27:42 +08:00
    FoxRiverMan
        1
    FoxRiverMan  
       16 天前   ❤️ 5
    你的问题太天真了!你以为 Rust 是 Java 吗?还想要 MyBatis 式的爽快?醒醒吧! Rust 玩的是编译时安全,不是 runtime 魔法。那些 ORM 框架还在用生命值交换类型安全,用宏展开模拟动态查询,它们连 MyBatis 的脚后跟都摸不到!

    别做梦了!在 Rust 里想同时拥有 ORM 的对象映射和原生 SQL 的灵活?要么跪着用 sea-orm 的 ActiveRecord 模式,要么像苦行僧一样手写 sqlx 的映射代码。你以为 diesel 的查询 DSL 很牛逼?那不过是编译器用铁链拴着你跳舞!

    Java 的 MyBatis 能边喝咖啡边写 XML 动态 SQL ,Rust 的 sqlx 让你跪着检查每个问号参数的类型安全!你想要的"字段映射到对象"?在 Rust 里每个结构体都要用#[derive(Debug, Clone, sqlx::FromRow)]来献祭,连枚举类型都要自己实现 Typesqlx::Postgres !

    醒醒吧!用 Rust 写 Web 就像用手术刀砍树——要么你足够疯魔把整个生态链重写一遍,要么就老实承认这玩意儿现在根本不适合快速开发 Web 应用!等你的项目被生命周期标注搞得欲仙欲死时,Java 程序员早把功能上线十次了!
    springz
        2
    springz  
       16 天前
    sea-orm 还有一个 https://github.com/SeaQL/sea-query 用一下这个试试,看看能不能找到熟悉的体验。

    web framwork 我推荐你用 salvo 也看看能不能找到熟悉的感觉。https://github.com/salvo-rs/salvo
    5261
        3
    5261  
    OP
       16 天前
    @FoxRiverMan 同意~ 当时也是出于说想找 web3 remote 工作去了解了下 Rust ,加上自己是 Java 应用开发,所以想着用 Rust 自己搭建个项目重写一遍 Java 的需求,写到一半发现很难受

    那 Go 写 web 是不是就比 Rust 更适合呢?
    5261
        4
    5261  
    OP
       16 天前
    @springz sea-orm 更难受~有点当初 habeinate 的感觉
    peteretep
        5
    peteretep  
       16 天前   ❤️ 15
    哦我的上帝啊!
    rust 要是再以 web 服务的样子出现,
    Springboot 会发誓用它的自动装配狠狠地把 aop 踢进 rust 的屁股!
    springz
        6
    springz  
       16 天前
    @5261 请注意我说的是 sea-query 。
    springz
        7
    springz  
       16 天前
    我也不是很习惯 sea-orm ,用 sea-query 会比 sqlx 裸写 sql 好很多。
    openmynet
        8
    openmynet  
       16 天前
    sea-orm 用着难受是没有结合自定义宏一起使用,sea-orm + validator + serder-aux 前端配合 ts 的 interface 不比 java 的 MyBatis 好上百倍
    344457769
        9
    344457769  
       16 天前
    @FoxRiverMan V2EX 不允许发布 AI 生成的内容的。
    FoxRiverMan
        10
    FoxRiverMan  
       16 天前
    @344457769 刚问了 Siri ,它说本消息由你的母语基因自动生成,要封建议从甲骨文开始封起
    kenshinhu
        11
    kenshinhu  
       16 天前
    如果不写 Web ,Rust 可以有哪些实践?
    hangbale
        12
    hangbale  
       16 天前
    用 actix 写过,很痛苦,开发效率低,后面还是回到 node 了
    5261
        14
    5261  
    OP
       16 天前
    @kenshinhu 我猜 估计更适合除 web 开发外的场景~
    5261
        15
    5261  
    OP
       16 天前
    @springz ok ,sorry ,刚没注意
    5261
        16
    5261  
    OP
       16 天前
    @springz salvo 这个 web 框架看着像国内团队开发的? 有点 Java 那味 哈哈
    lancelock
        17
    lancelock  
       16 天前
    mybatis ... 爽吗?
    iyaozhen
        18
    iyaozhen  
       16 天前
    额 rust 写 web 还不成熟吧。大部分业务 qps 很小,牺牲效率换取性能,得不偿失
    sleepm
        19
    sleepm  
       16 天前
    Wh1t3zZ
        20
    Wh1t3zZ  
       16 天前   ❤️ 1
    @FoxRiverMan #1 提醒下频繁发布 AI 生成内容会被 ban
    5261
        21
    5261  
    OP
       16 天前
    @iyaozhen 嗯,对我来说就是熟悉下整个流程,估计一开始我对 Rust 的定位没看清楚
    5261
        22
    5261  
    OP
       16 天前
    @iyaozhen 你们用 Rust 主要用在什么场景呢
    maichael
        23
    maichael  
       16 天前
    学新语言切忌新刀砍老瓜和拿着刀找瓜,你已经有可以砍 Web 的刀了,然后你还找一把刀来砍 Web ,然后你还希望它跟第一把刀一模一样,那干嘛不用原来那把呢?
    springz
        24
    springz  
       16 天前
    salvo 我感觉更像 go 生态的 gin ,用起来简单,没太多复杂概念。我一般是 salvo + sea-query 。
    XiLingHost
        25
    XiLingHost  
       16 天前
    rust 感觉适合用来做中间件和底层库,写应用层的东西感觉不合适
    springz
        26
    springz  
       16 天前
    rust 写 web 优势我个人觉得就是性能+可靠吧,糊业务现在用 js/ts 更爽。
    springz
        27
    springz  
       16 天前
    go 写业务也不合适啊,不照样一堆后端业务拿 go 写。
    5261
        28
    5261  
    OP
       16 天前
    @maichael 主要是原来的 Java 瓜 不太适合初创或者快速项目啊,同样的 qps 场景下,Java 的 it 成本那就是无底洞!
    coderzhangsan
        29
    coderzhangsan  
       16 天前
    go 火的时候做 web 应用,rust 火的时候还做 web 应用,实在搞不懂你们的脑洞,这 2 门语言的发明初衷不是为了 web 应用的吧? web 应用已经有一大堆语言了,还在上面造轮子,你们可真有精力啊。要明白一个道理,颠覆一个行业或者取代一个产品,不是简单地把轮子重新造一遍,肯定有颠覆性的创新在里面或者极致性的体验。
    springz
        30
    springz  
       16 天前
    啥业务能跑到 springboot 的性能问题,能到上限招人加机器不成问题。
    Leviathann
        31
    Leviathann  
       16 天前
    连 mybatis 都能吹上

    你还是别用 rust 了
    coderzhangsan
        32
    coderzhangsan  
       16 天前
    学新语言,就一定要理解的它的设计思维,有些人总会把母语的思想代入新语言中,以母语习惯在新语言里开发和设计,如果两门语言设计思维相差很大,就会搞得不伦不类,最后母语的习惯,指责新语言蹩脚之处。
    mrsecond
        33
    mrsecond  
       16 天前
    @FoxRiverMan 一股 ds 味
    cccssss
        34
    cccssss  
       16 天前
    @coderzhangsan 你去劝劝 tokio 的作者,别发明 axum 啊
    5261
        35
    5261  
    OP
       16 天前
    @Leviathann 我的错,不应该技术吹! 哥们日常用啥语言开发呢?
    iyaozhen
        36
    iyaozhen  
       16 天前
    @5261 #21 代替 c++,做客户端 lib sdk
    web 也有,但都是非常极端的性能场景,go 也扛不住的那种。可能省几万个 pod 才有意义做
    bjfane
        37
    bjfane  
       16 天前
    看过别人写的主机监控上报到 server 的全 rust 开源项目,自己从头理了一遍,里面还有 grpc 的东西,装在机器上的 agent 倒是合适 rust ,整体看 server 用别的语言更好,比如 go 啥的,自己写起来顺手的就行。
    玩具型的 最近再看 bun 一把梭,虽然可能不适合企业级,但是一把梭就不错,还内嵌 postgre,sqlite 驱动呢
    layxy
        38
    layxy  
       16 天前
    @5261 你放心好了,我已经试了,go 的 orm 框架也有同样的问题,基本都是字段映射到对象做的挺好,一旦要自定义查询就费劲
    springz
        39
    springz  
       16 天前
    请注意,我们在说 orm 的时候,涉及到 3 个 概念。

    orm:类似 java 的 hibernate ,jpa 。php 的 Eloquent ORM ,rust 的 sea-orm ,这层讲究的是对象关系映射,把表结构映射到对象上,完全隐藏 sql 等概念。

    sql-builder: 类似 java 的 mybatis ,js/ts 的 kysely 或 knex ,rust 的 sea-query ,这层讲究的是辅助更好的写 sql ,组装 sql 。并处理数据到对象的映射。并不隐藏 sql 概念,只是辅助。

    sql-driver: 类似 java 的 odbc ,js/ts 的 node-pg 等,rust 的 sqlx ,这层讲究的是驱动,连接等底层,纯 sql 。 不处理映射等或者简单映射。

    各有利弊,按需选择。不同层级的不要一起比较。
    springz
        40
    springz  
       16 天前
    我最开始工作是纯 sql 然后在我工作第 2-3 年的时候我喜欢用 sql-builder ,工作第 5 年的时候我用 orm ,工作第 8 年的时候我喜欢各种 sql-builder ,现在我几乎回到了纯 sql ,只是加一些模板工具方便写 sql 。
    springz
        41
    springz  
       16 天前   ❤️ 1
    web 框架说白了就是在处理 res 和 req 和它们加入中间件(要不就是过滤器模式要不洋葱圈),用多了就会感觉一个样。所有语言只要是处理 http 的都是近似设计。

    不同的场景按需选择就好。不同的语言有不同的生态和利弊。
    YsHaNg
        42
    YsHaNg  
       16 天前 via iPhone
    macwenbo
        43
    macwenbo  
       16 天前
    @FoxRiverMan 有 ai 后,我感觉问题不大了。。定义好请求参数,返回结果,把 sql 一扔,一个函数 tab ,tab 就写完了。现在裸 sql ,比以前友好太多了。
    fly2never
        44
    fly2never  
       16 天前
    我一直觉得, 如果能容忍 GC, 那没必要选择 Rust. 他带来的复杂度绝大多数和内存生命周期相关.
    在无 GC 的需求下, 先看看自己项目的生态和 已有的 C/C++库联系紧密不, 如果紧密就直接 C/C++吧, 不然写一大堆 unsafe 也没意思.

    最后如果上述都不满足, 那就顺顺利利用 Rust, 这才是 Rust 的主战场. 比如高性能数据库开发, 高性能 WASM 等等
    fly2never
        45
    fly2never  
       16 天前
    @springz go 最适合写业务了, 这个可以和 java 媲美
    darkless456
        46
    darkless456  
       16 天前
    rust 试过一阵,感觉不太适合 web 开发,一些底层的东西更适合些。
    FightPig
        47
    FightPig  
       16 天前
    用 rust 写过,太麻烦了,我最后还是用 rails 一把梭了,rust 我只拿来做一些跨平台的应用时写写,本来用 go 写的,结果 win 下 360 个恶心的东西,天天报毒
    ChiuLam
        48
    ChiuLam  
       15 天前
    hibernate 拼错的人确实多
    gujuji
        49
    gujuji  
       15 天前
    @FoxRiverMan 会说多说。。。
    lcbp
        50
    lcbp  
       15 天前
    还得是 PHP 啊
    ThinkCat
        51
    ThinkCat  
       15 天前
    web 建议使用一下 rocket.rs ,体感上和 node go 使用方式类似,要和 java 的框架比,确实比不上,但是也没上面说的那么不堪。orm 目前看确实简陋。
    abcbuzhiming
        52
    abcbuzhiming  
       15 天前
    web 这种高度动态的玩意,天生就不适合这种需要长时间静态编译检查的语言。你看在 web 领域能占据一席之地的语言,要不就是那种“瞎写也出不了大问题”的脚本语言,要么就是“虽然我要求严格但是我编译很快”的静态语言。rust 这种改起来之前,得认真想清楚,以通过编译器的语言,确实不是回合
    ShadowPower
        53
    ShadowPower  
       15 天前
    用 rust 写 web 和用 C/C++写 web 的体验并没有太大的差别
    5261
        54
    5261  
    OP
       15 天前
    @ThinkCat
    暂时先用 axum + sea-query 熟悉下 rust 写 web 代码,不能白学一趟

    @abcbuzhiming
    @ShadowPower 二位的评论很中肯!
    encro
        55
    encro  
       15 天前
    可以的,
    我就用 axum 做了一个图形处理的 web api 。
    底层对接 opencv 库,上层接口用 axum 。
    太稳定了用了几年了,就 16M 内存。。。
    wapzjn
        56
    wapzjn  
       15 天前
    如果习惯 mybatis 的话 ORM 可以尝试使用 rbatis
    5261
        57
    5261  
    OP
       15 天前
    @wapzjn 好的,晚点我去看下
    Nugine0
        58
    Nugine0  
       14 天前
    @FoxRiverMan 一眼 deepseek 生成内容,这玩意已经能被人类识别了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2542 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:27 · PVG 23:27 · LAX 08:27 · JFK 11:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.