Skip to main content

Module dialect

Module dialect 

Source
Expand description

方言层 —— 一套 SQL 模板跑 sqlite / postgres / mysql。

加 MySQL 之前只有两种后端,sqlx::Any$N 占位符就够了。MySQL 一进来 同时打破三条,所以必须有这一层。全部实测(sqlx 0.8 / pg16 / mysql8.0.44):

sqlitepostgresmysql
$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 侧挡,不能指望数据库报错。