Expand description
方言层 —— 一套 SQL 模板跑 sqlite / postgres / mysql。
加 MySQL 之前只有两种后端,sqlx::Any 配 $N 占位符就够了。MySQL 一进来
同时打破三条,所以必须有这一层。全部实测(sqlx 0.8 / pg16 / mysql8.0.44):
| sqlite | postgres | mysql | |
|---|---|---|---|
$1 占位符 | ✅ | ✅ | ❌ Unknown column '$1' |
? 占位符 | ✅ | ❌ 语法错误 | ✅ |
ON CONFLICT DO NOTHING | ✅ | ✅ | ❌ 1064 语法错误 |
INSERT IGNORE | ❌ | ❌ | ✅ |
TEXT PRIMARY KEY | ✅ | ✅ | ❌ 1170 要 key length |
CREATE INDEX IF NOT EXISTS | ✅ | ✅ | ❌ 1064 语法错误 |
还有一条踩过就忘不了的:MySQL 的 ON DUPLICATE KEY UPDATE 在重复时
rows_affected 返回 1(不是 0),拿它做幂等判断会把“已存在“误判成
“刚插入”。所以 MySQL 必须用 INSERT IGNORE。
§写 SQL 的规矩
模板里统一用 ? 当占位符(跟 MySQL 一致),非 MySQL 后端由 Backend::q
自动换成 $1..$n。
⚠ 所以模板的字符串字面量里不能出现 ? —— 会被当成占位符。
目前所有 SQL 都满足(字面量只有 '' 和 'prepared' 这类)。
Structs§
- TooLong
- 值超过列宽
Enums§
- Backend
- 支持的后端
Functions§
- check_
len - 写库前挡住超长的值。必须在 Rust 侧挡,不能指望数据库报错。