Rust in Everything
基于 sea-orm 2.0.4

动手

前面十部分读的是 sea-orm 和 sea-query 的源码。这一部分反过来,不用这两个库,直接在 sqlx 0.9.0 上写一个迷你 ORM:实体是手写的 impl,没有过程宏;SQL 由一个几十行的构造器拼出来,值全部变成 $N 参数;写入用和 sea-orm 一样的 Set / Unchanged / NotSet 三态。写完之后在同一张表上让两边做同样的操作,比较 sqlx 日志里的 SQL 和线上的 Parse / Bind。

  1. 写一个迷你 ORM:四个文件约 500 行,只依赖 sqlx 和 tokio。EntityTrait 用关联常量描述表、列和主键;Select 的 filter / order_by / limit 各改一个子句,build 产出 $N 的 SQL 和参数,LIMIT 也是参数;update 只写 Set 的列,主键 NotSet 时返回错误、不发语句;insert 写 Set 和 Unchanged,靠 RETURNING 一条语句拿回整行。七种操作发出的 SQL 与 sea-orm 2.0.4 逐字相同,抓包的两条语句连参数类型和字节都相同;eq(None) 和超出 int8 的 limit 两处不同。
flowchart TB
  ent["EntityTrait 手写 impl"] --> sel["Select 构造器"]
  ent --> av["ActiveValue 三态"]
  sel --> st["Statement 和 $N"]
  av --> wr["insert 和 update"]
  wr --> st
  st --> sqlx["sqlx query_with"]
  sqlx --> cmp["与 sea-orm 对照"]

💬 关联讨论

发起讨论
加载中...