- 支持试读
内容介绍
本专题将通过实现一个自动生成数据库 CRUD 的 Derive宏 来对过程宏 `proc-macro` 进行一步步的探讨。我们希望通过本专题的学习,能让你掌握 rust 过程宏的知识要点,并将其应用到实际开发中。 - 支持试读
解析 derive(Db)
本章我们将开始实现第一步:解析 `derive(Db)`。 - 支持试读
解析目标结构体的元数据
本章我们将讨论如何解析目标结构体的元数据,包括:结构体的名称、结构体的字段(包括可见性、字段名和数据类型)。 解析Derive和字段的属性,并实现 CRUD 操作中的插入
本章我们将实现 CRUD 操作中的【插入】。在实际开发中,有些字段是不需要插入的,比如自动编号的主键。我们可以通过宏属性来指定哪些字段不需要插入。同时,我们还要通过宏属性来指定目标结构体的表名、主键以及是否为视图等。- 支持试读
实现更新和删除方法
有了上一章的基础,我们实现更新和删除方法也不是难事。 实现单条数据的查找
本章我们将讨论如何用宏为目标结构体实现单条数据的查找。实现数据列表和分页
本章我们将讨论如何用宏为目标结构体实现数据列表和分页。
内容介绍
- 3698
- 2024-07-03 05:36:44
目标
- 实现 CRUD,基于 sqlx
- 实现自定义表名、主键及是否为视图
- 实现某些字段跳过插入
- 实现某些字段跳过更新
- 实现查找单条记录的过滤条件,并可指定过滤条件是使用
ILIKE
进行模糊查询,还是使用=
进行精确匹配。 - 实现记录列表的过滤条件,并可指定过滤条件是使用
ILIKE
进行模糊查询,还是使用=
进行精确匹配。 - 实现分页
本专题使用的是 PostgreSQL 数据库,并未对其它数据库做兼容处理。
本专题使用的是 PostgreSQL 数据库,并未对其它数据库做兼容处理。
预览
最终,我们希望达到的效果是:
#[derive(Db)]
#[db(table = "users", pk = "id")]
pub struct User {
#[db(find)]
pub id: String,
#[db(find)]
#[db(list_opt)]
#[db(opt_like)]
pub email: String,
pub password: String,
#[db(list_opt)]
#[db(opt_like)]
pub nickname: String,
#[db(skip_update)]
pub dateline: chrono::DateTime<chrono::Local>,
}
#[derive(Db)]
#[db(table = "messages", pk = "id")]
pub struct Message {
#[db(find)]
#[db(skip_insert)]
pub id: i32,
#[db(list_opt)]
#[db(skip_update)]
pub user_id: String,
#[db(list_opt)]
#[db(opt_like)]
pub content: String,
#[db(skip_update)]
pub dateline: chrono::DateTime<chrono::Local>,
}
#[derive(Db)]
#[db(table = "v_user_messages", pk = "user_id, message_id", is_view)]
pub struct UserMessage {
#[db(list_opt)]
#[db(opt_like)]
pub email: String,
#[db(list_opt)]
#[db(opt_like)]
pub nickname: String,
#[db(find_opt)]
#[db(list_opt)]
pub message_id: i32,
#[db(find_opt)]
#[db(list_opt)]
pub user_id: String,
#[db(list_opt)]
#[db(opt_like)]
pub content: String,
pub dateline: chrono::DateTime<chrono::Local>,
}
/// 插入
User::insert<'a>(&self, e: impl sqlx::PgExecutor<'a>) -> sqlx::Result<String>;
/// 更新
User::update<'a>(&self, e: impl sqlx::PgExecutor<'a>) -> sqlx::Result<u64>;
/// 查找单条
User::find<'a>(e: impl sqlx::PgExecutor<'a>, f:&UserFindFilter) -> sqlx::Result<Option<Self>>;
/// 列表
User::list_data<'a>(e: impl sqlx::PgExecutor<'a>, f:&UserListFilter) -> sqlx::Result<Vec<Self>>;
/// 统计
User::list_count<'a>(e: impl sqlx::PgExecutor<'a>, f:&UserListFilter) -> sqlx::Result<i64>;
/// 分页
User::list(p: &sqlx::PgPool, f:&UserListFilter) -> sqlx::Result<UserPaginate<Self>>;
/// 删除
User::list_count<'a>(e: impl sqlx::PgExecutor<'a>, id:&String) -> sqlx::Result<u64>;