Beerus-DB数据库操作框架

联合创作 · 2023-10-01

Beerus-DB,是 Beerus 的子项目之一,是一个数据库操作框架,用到了[go-sql-driver/mysql]来做数据库连接与基础操作,在此基础上做了很多扩展,比如:连接池管理,多数据源,事务管理,单表无sql操作,多表以及复杂操作可以自己写sql,sql支持{}占位符,可以用struct作为参数来操作数据库等

文档

https://beeruscc.com/beerusdb

示例

单表操作

根据条件查询单表数据

conditions := make([]*entity.Condition,0)
conditions = append(conditions, entity.GetCondition("id > ?", 10))
conditions = append(conditions, entity.GetCondition("and (user_name = ? or age > ?)", "bee", 18))
conditions = append(conditions, entity.GetCondition("order by create_time desc", entity.NotWhere))

resultMap, err := operation.GetDBTemplate("Data source name").Select("table name", conditions)

根据条件修改单表数据

// Conditions set
conditions := make([]*entity.Condition,0)
conditions = append(conditions, entity.GetCondition("id = ?", 1))

// Data settings to be modified
data := ResultStruct{UserName: "TestNoSqlUpdate"}

// Execute the modification operation
result, err := operation.GetDBTemplate("Data source name").Update("table name", dbutil.StructToMapIgnore(&data, data, true),conditions)

根据条件删除单表数据

// Set delete conditions
conditions := make([]*entity.Condition,0)
conditions = append(conditions, entity.GetCondition("id = ?", 2))

// Perform a delete operation
_, err := operation.GetDBTemplate("Data source name").Delete("table name", conditions)

插入一条数据

data := ResultStruct{
		UserName: "TestNoSqlInsert",
		UserEmail: "xxxxx@163.com",
		UpdateTime: "2021-12-09 13:50:00",
	}

result, err := operation.GetDBTemplate("Data source name").Insert("table name", dbutil.StructToMapIgnore(&data, data, true))

自定义sql

查询

// struct参数
res := ResultStruct{Id: 1}

// 查多条, 注:这里需要用到占位符
resultMap, err := operation.GetDBTemplate("Data source name").SelectListByMap("select * from xt_message_board where id < {id}", dbutil.StructToMap(&res, res))

// 查一条, 注:这里需要用到占位符
resultMap, err := operation.GetDBTemplate("Data source name").SelectOneByMap("select * from xt_message_board where id < {id}", dbutil.StructToMap(&res, res))

增删改

res := ResultStruct{Id: 1, UserName: "TestUpdateByMap"}

// 无论是增删改,都是调用ExecByMap函数,将sql和参数传入即可,注:这里需要用到占位符
operation.GetDBTemplate("Data source name").ExecByMap("update xt_message_board set user_name = {user_name} where id = {id}", dbutil.StructToMap(&res, res))

分页查询

data := ResultStruct{
    UserName: "TestNoSqlInsert",
    UserEmail: "xxxxx@163.com",
}

// 创建分页参数
param := entity.PageParam{
    CurrentPage: 1,  // 第几页
    PageSize: 20,  // 每页多少条
    Params: dbutil.StructToMap(&data, data), // 查询参数
}

// 执行查询操作
result, err := operation.GetDBTemplate("Data source name").SelectPage("select * from xt_message_board where user_name = {user_name} and user_email = {user_email}", param)

事务管理

// 开启事务
id, err := db.Transaction()
if err != nil {
    t.Error("TestUpdateTx: " + err.Error())
    return
}

res := ResultStruct{Id: 1, UserName: "TestUpdateTx"}

// 注:这里使用的不是GetDBTemplate,ExecByMap,而是 GetDBTemplateTx 和 ExecByTxMap
// 使用事务和不使用事务,在调用的函数上,区别就是多了个Tx
ss, err := operation.GetDBTemplateTx(id, "dbPoolTest").ExecByTxMap("update xt_message_board set user_name = {user_name} where id = {id}", dbutil.StructToMap(&res, res))

if err != nil {
    // 如果有问题就回滚事务
    db.Rollback(id)
    t.Error("TestUpdateTx: " + err.Error())
    return
}

// 提交事务
db.Commit(id)

想了解更多的话,可以查阅我们的文档哦

浏览 3
点赞
评论
收藏
分享

手机扫一扫分享

编辑
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑
举报