Rust in Everything
基于 sqlx 0.9.0

全景

这一部分不深入任何一个 trait,先回答两个问题:sqlx 为什么是现在这个样子,以及一次 fetch_one 在线上到底发了哪些消息。读完之后,02 核心抽象到 04 连接池里的每一章,都能在这里的抓包里找到对应的那几行。

  1. sqlx 解决什么问题:「写 SQL,在编译期对真实数据库检查」的定位,以及它因此揽下的四件事;和 tokio-postgres 只比设计,用同一个代理抓包,tokio-postgres 传字符串每次都重新 Parse、一条连接上可以流水线,sqlx 靠语句缓存和池;和 diesel、sea-orm 的分界线是「SQL 由谁写、检查对着谁」;纯 Rust 协议为什么让驱动全程异步,SQLite 为什么每条连接一个专用线程。
  2. 一次查询的全过程:一个本地 TCP 代理打出每条协议消息;第一次执行是借出 ping、Parse + Describe + Sync、Bind + Execute + Close + Sync 三个来回,第二次命中语句缓存只剩两个;fetch_one 其实是 fetch_optional,会读完所有响应;不 bind 的 query() 照样走预备语句,只有 &str 和 raw_sql 走简单查询、结果是文本格式。
flowchart TB
  why["为什么这样设计"] --> four["协议 缓存 池 宏"]
  four --> one["一次 fetch_one"]
  one --> pool["借连接与归还"]
  one --> proto["Parse Bind Execute Sync"]
  one --> row["DataRow 到 FromRow"]

💬 关联讨论

发起讨论
加载中...