18910140161

Go使用闭包简化数据库操作代码

顺晟科技

2021-06-16 10:27:40

305

在日常工程中,我们可能要开事务来完成一些操作,因此就会有如下代码:

//更新任务备注更新任务备注

func UpdateTaskRemote(TaskID uint 32,备注字符串)错误{

sql,args,err :=sq .更新('任务')。“Set(”备注,备注)。Set('updated_at ',getNowTS()).其中(' id=?',taskID).ToSql()

如果出错!=零{

返回错误

}

tx,err :=db .Beginx()

如果出错!=零{

返回错误

}

_,err=tx .Exec(sql,args.)

如果出错!=零{

返回错误

}

err=tx .提交()

如果出错!=零{

洛克罗斯。错误('无法提交事务: %s,回滚它,错误)

返回德克萨斯州.回滚()

}

返回零

}

如果只有一个,似乎没有什么问题,但是,一旦操作多了之后,要在每个模型操作函数中都写上这一堆重复的代码,那就不太妙了。因此得想一个办法来进行抽象,把开事务、提交和回滚的操作封装起来。借助闭包我们可以做到这一点:

//工具函数用于在事务中执行,自动提交和回滚

键入TxFunc func(tx *sqlx .Tx)错误

//ExecInTx传入一个闭包函数,签名类型为TxFunc。在ExecInTx中先开事务,

//然后将事务传入闭包函数,如果闭包函数没有返回错误就提交,否则回滚。

func ExecInTx(f TxFunc)错误{

tx,err :=db .Beginx()

如果出错!=零{

返回错误

}

err=f(tx)

如果出错!=零{

返回错误

}

err=tx .提交()

如果出错!=零{

洛克罗斯。错误('无法提交事务: %s,回滚它,错误)

返回德克萨斯州.回滚()

}

返回零

}

由此,型号操作函数就简化成了:

//更新任务备注更新任务备注

func UpdateTaskRemote(TaskID uint 32,备注字符串)错误{

sql,args,err :=sq .更新('任务')。“Set(”备注,备注)。Set('updated_at ',getNowTS()).其中(' id=?',taskID).ToSql()

如果出错!=零{

返回错误

}

返回ExecInTx(func(tx *sqlx .Tx)错误{

_,err :=tx .Exec(sql,args.)

返回错误

})

}

如上。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航