全景
这一部分不深入任何一个 trait,先回答两个问题:sqlx 为什么是现在这个样子,以及一次 fetch_one 在线上到底发了哪些消息。读完之后,02 核心抽象到 04 连接池里的每一章,都能在这里的抓包里找到对应的那几行。
- sqlx 解决什么问题:「写 SQL,在编译期对真实数据库检查」的定位,以及它因此揽下的四件事;和 tokio-postgres 只比设计,用同一个代理抓包,tokio-postgres 传字符串每次都重新
Parse、一条连接上可以流水线,sqlx 靠语句缓存和池;和 diesel、sea-orm 的分界线是「SQL 由谁写、检查对着谁」;纯 Rust 协议为什么让驱动全程异步,SQLite 为什么每条连接一个专用线程。 - 一次查询的全过程:一个本地 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"]
💬 关联讨论
发起讨论加载中...