用途:在 Rust 中用 Diesel 进行类型安全的持久化,包括 schema.rs 生成、查询 DSL、migrations 以及在 Axum/Tokio 下的 diesel-async 异步访问。
主要能力:diesel 提供 DSL、table! 与迁移 CLI;diesel_migrations 可在仓库已嵌入时嵌入二进制;diesel-async 提供 AsyncPgConnection / run_query;连接池使用 deadpool 或 bb8,依据项目 Cargo.toml。CLI 包括 diesel setup、migration、print-schema。schema.rs 为生成文件,除非项目已有手工维护习惯,否则不应手改。目录组织含 migrations/、src/schema.rs(生成)、models/、db.rs(异步池);模型使用 Queryable、Insertable、AsChangeset,features postgres/chrono/uuid 需与 schema 对齐。
用法要点:Axum handler 中对 diesel_async::RunQueryDsl 使用 .await;同步调用仅限 spawn_blocking 且属于遗留代码,不要新增同步路径。diesel::update/filter 需带 id 与租户条件,唯一约束冲突映射到 AppError 409。复合写入使用异步事务(conn.transaction)。改表时同一 PR 内更新 print-schema 与 migration。连接池放入 State,避免每请求新建连接。查询用 DSL,如 users::table.filter(users::id.eq(id)).first();大列表显式 select,避免整行加载。被修改的聚合用 for_update,后台 worker 用 skip_locked。深分页优先 keyset。DSL 能表达时不要拼 SQL 字符串,sql_query 仅用于 FTS 或特定 upsert 等合理场景。
限制与反模式:不要在 extractor 中 establish_connection 或 block_on;不要改 schema.rs 却忘记 migration;不要 load 整表;不要在同一服务混用 Diesel 与 SeaORM 而无 crate 边界;生产环境不要用 expect("db")。SQLite 的同步使用可保留在 CLI/测试,HTTP API 保持异步。其他细节(如具体版本、性能数据、收费标准)暂未提供。