sqlxplus
在保持 SQLx 性能与 SQL 灵活性的前提下,为 Rust 项目提供一套可生产、跨 MySQL/Postgres/SQLite 的高级数据库封装(CRUD、分页、动态查询、代码生成)。
特性
- 兼容性:支持 MySQL、Postgres、SQLite,切换仅需配置 URL
- 性能:所有底层使用 SQLx 原生命令,避免运行时抽象开销
- 开发体验:提供类似 ORM 的便捷 API(
Modeltrait、derive(CRUD)宏、QueryBuilder),减少样板代码 - 可扩展性:支持自定义 SQL、事务、原生 query 访问;易于扩展新数据库
- 安全性:SQL 参数化、编译期检查(尽可能),严禁字符串拼接用于用户输入
- 可生成:命令行工具从 schema 自动生成 model + CRUD + tests
快速开始
安装
[]
= { = "0.2.0", = ["mysql"] }
= { = "0.8.6", = ["runtime-tokio-native-tls", "chrono", "mysql"] }
= { = "1.40", = ["full"] }
根据你使用的数据库选择对应的 feature:
- MySQL:
features = ["mysql"] - PostgreSQL:
features = ["postgres"] - SQLite:
features = ["sqlite"] - 或同时启用多个:
features = ["mysql", "postgres", "sqlite"]
基础示例
use ;
// 定义模型
async
详细使用文档
1. 定义模型
使用 ModelMeta 和 CRUD 宏自动生成 CRUD 操作:
属性说明:
table: 数据库表名pk: 主键字段名(默认为 "id")soft_delete: 逻辑删除字段名(可选)
2. 逻辑删除
支持逻辑删除(软删除),只需指定 soft_delete 字段:
// 使用逻辑删除
delete_by_id.await?; // 将 is_deleted 设置为 1
// 查询时自动过滤已删除的记录
let post = find_by_id.await?; // 返回 None
3. CRUD 操作
插入(Create)
let user = User ;
let id = user.insert.await?;
查询(Read)
// 根据 ID 查询单条记录
let user = find_by_id.await?;
// 根据多个 ID 查询
let users = find_by_ids.await?;
// 使用查询构建器查询单条
let builder = new.and_eq;
let user = find_one.await?;
// 查询所有(最多 1000 条)
let users = find_all.await?;
更新(Update)
// Patch 语义:Option 字段为 None 时不更新
let mut user = find_by_id.await?.unwrap;
user.name = Some;
user.email = None; // 不更新 email 字段
user.update.await?;
// Reset 语义:Option 字段为 None 时重置为数据库默认值
user.update_with_none.await?;
删除(Delete)
// 根据模型配置自动选择物理删除或逻辑删除
delete_by_id.await?;
// 强制物理删除
hard_delete_by_id.await?;
// 强制逻辑删除(需要配置 soft_delete)
soft_delete_by_id.await?;
4. 查询构建器
QueryBuilder 提供了安全、灵活的动态查询构建:
use QueryBuilder;
// 基础查询
let builder = new
.and_eq
.and_like
.order_by; // false = DESC
let users = find_all.await?;
// 条件分组
let builder = new
.and_group
.and_gt;
// SQL: WHERE (status = 1 OR status = 2) AND age > 18
// 复杂查询
let builder = new
.and_in
.and_between
.and_is_not_null
.order_by
.limit
.offset;
可用方法:
- 比较:
and_eq,and_ne,and_gt,and_gte,and_lt,and_lte - 模糊:
and_like,and_not_like - 范围:
and_in,and_not_in,and_between - 空值:
and_is_null,and_is_not_null - 分组:
and_group,or_group - 排序:
order_by - 限制:
limit,offset
5. 分页查询
let builder = new
.and_eq
.order_by;
let page = paginate.await?;
println!;
println!;
println!;
println!;
println!;
6. 事务支持
use Transaction;
// 开启事务
let mut tx = pool.begin.await?;
// 在事务中执行操作
let user = User ;
let id = user.insert.await?;
// 更新
let mut user = find_by_id.await?.unwrap;
user.status = Some;
user.update.await?;
// 提交事务
tx.commit.await?;
7. 数据库连接
use DbPool;
// MySQL
let pool = connect.await?;
// PostgreSQL
let pool = connect.await?;
// SQLite
let pool = connect.await?;
let pool = connect.await?; // 内存数据库
8. 统计查询
let builder = new.and_eq;
let count = count.await?;
println!;
项目结构
sqlx-plus/
├─ core/ # 核心库(sqlxplus)- 已发布到 crates.io
├─ derive/ # proc-macro crate(sqlxplus-derive)- 已发布到 crates.io
├─ cli/ # 代码生成器
└─ examples/ # 示例项目
├─ mysql_example/
├─ postgres_example/
└─ sqlite_example/
功能特性
- ✅ CRUD 操作(Create, Read, Update, Delete)
- ✅ 逻辑删除支持(soft delete)
- ✅ 分页查询(paginate)
- ✅ 事务支持(Transaction)
- ✅ 安全查询构建器(QueryBuilder)
- ✅ 条件分组(AND/OR with parentheses)
- ✅ GROUP BY 和 HAVING 支持
- ✅ LIMIT/OFFSET 支持
- ✅ 多数据库支持(MySQL, PostgreSQL, SQLite)
- ✅ 类型安全的参数绑定
- ✅ 编译期类型检查
- ✅ 异步操作
注意事项
- 字段类型:建议使用
Option<T>包装字段,以支持 NULL 值和灵活的更新语义 - 主键:主键字段通常使用
Option<i64>,插入时设为None自动生成 - 更新语义:
update(): Patch 语义,None值的字段不更新update_with_none(): Reset 语义,None值的字段重置为默认值
- 性能:查询构建器使用参数化查询,避免 SQL 注入,性能与手写 SQL 相当
示例代码
查看 examples/ 目录获取完整的示例代码:
License
MIT OR Apache-2.0