Ruoyi-Go 实战 - 数据库操作篇
数据库配置
在config.yaml里面进行数据的配置
database:
type: mysql
host: localhost 数据库地址
port: 3306 数据库端口号
username: root 数据库用户名
password: 123456 数据库密码
dbname: ry-go 数据库
max_idle_conn: 10
max_open_conn: 30
conn_max_lifetime: 300
gorm 使用
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
The fantastic ORM library for Golang aims to be developer friendly.
特性
全功能 ORM
关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
Create,Save,Update,Delete,Find 中钩子方法
支持 Preload、Joins 的预加载
事务,嵌套事务,Save Point,Rollback To Saved Point
Context、预编译模式、DryRun 模式
批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
复合主键,索引,约束
Auto Migration
自定义 Logger
灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
每个特性都经过了测试的重重考验
开发者友好
1、 查询部分
单表查询
var list []SysJobLog
utils.MysqlDb.Model(SysJobLog{}).Find(&list)
分页查询
utils.MysqlDb.Model(SysJobLog{}).Order("job_log_id DESC").Offset(offset).Limit(pageSize).Find(&list)
或sql
sql = " limit 1, 10"
err := utils.MysqlDb.Raw(sql).Scan(&list).Error
即可得到list数据
实体部分
type Article struct {
Id uint64 `json:"id"`
Title string `json:"title"`
Content string `json:"-"`
}
- 指定json格式字段不返回字段
type Article struct {
Id uint64 `json:"id,omitempty" gorm:"id,omitempty"`
Title string `json:"title,omitempty" gorm:"title,omitempty"`
}
omitempty 是实现公用,以免写多个结构体导致混乱。
时间格式化
CreateTime utils.JsonTime json:"createTime" gorm:"column:create_time;type:datetime"
jtime.JsonTime 中 对时间的处理
单执行sql 或 sql 返回数据
const sql = ""
查询
err := utils.MysqlDb.Raw(sql).Scan(&menus).Error
执行语句
if err := utils.MysqlDb.Exec("sql).Error; err != nil {
return R.ReturnFailMsg(err.Error())
}
2、新增
err := utils.MysqlDb.Create(&data).Error
err := utils.MysqlDb.save(&data).Error
3、更新
4、删除
err := utils.MysqlDb.Delete(&{{.ClassName}}{},"id = ?",id).Error
批量
err := utils.MysqlDb.Delete(&{{.ClassName}}{},"id in ?",ids).Error
事务
tx := utils.MysqlDb.Begin()
for i := 0; i < len(ids); i++ {
id := ids[i]
err := tx.Where("dict_code = ?", id).Delete(&SysDictData{}).Error
if err != nil {
tx.Rollback()
panic(R.ReturnFailMsg(err.Error()))
}
}
tx.Commit()
事务的封装
// 封装处理数据库事务
func Transact(db *gorm.DB, txFunc func(*gorm.DB) error) (err error) {
tx := db.Begin()
defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(R.ReturnFailMsg(p)) // re-throw panic after Rollback
} else if err != nil {
tx.Rollback()
panic(R.ReturnFailMsg(err.Error()))
} else {
tx.Commit()
}
}()
err = txFunc(tx)
return err
}
// 事务案例
//func DoSomething() error {
// return Transact(db, func (tx *gorm.DB) error {
// if _, err := tx.Exec(...); err != nil {
// return err
// }
// if _, err := tx.Exec(...); err != nil {
// return err
// }
// })
//}
其他技巧
1、mark[string]string
2、jsonBytes, _ := json.Marshal(person)
3、copier库的使用
genTable := tools.GenTable{}
err := copier.Copy(&genTable, tableVo)
4、gorm不直接支持UNION,您需要使用db.Raw来进行联合:
5、使用占位符, 完美避免
参考链接
https://github.com/go-gorm/gorm(地址)
https://gorm.io/zh_CN/docs(官方文档)
:sparkling_heart:支持这个项目
如果你正在使用这个项目并感觉良好,或只是想要支持我继续开发,你可以通过如下任意 方式支持我:
- Star 并 分享这个项目 :rocket:
- 通过以下二维码 一次性捐款。 我多半会买一杯
咖啡茶。:tea:
谢谢! :heart:
微信赞赏 | 微信 | 支付宝 |
---|---|---|
[图片上传失败...(image-6013a2-1739580073713)] | [图片上传失败...(image-c84265-1739580073713)] | [图片上传失败...(image-3a980b-1739580073713)] |