golang的多表联合orm
项目截图
1.数据库连接配置 DbConfigUtil.go
package config
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)
var GormDb *gorm.DB
func init() {
var err error
sqlStr := "root:123456@tcp(localhost:3306)/ry?charset=utf8mb4&parseTime=true&loc=Local"
// 关于配置可以参考 https://gorm.io/zh_CN/docs/gorm_config.html
GormDb, err = gorm.Open(mysql.Open(sqlStr), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
//DisableForeignKeyConstraintWhenMigrating: true, // 禁止创建外键
NamingStrategy: schema.NamingStrategy{ // 给创建表时候使用的
SingularTable: true,
// 全部的表名前面加前缀
//TablePrefix: "mall_",
},
})
if err != nil {
fmt.Println("数据库连接错误", err)
return
}
}
2.实体类以及 orm关系定义
UserController.go
package entity
import "gin/config"
//多表 orm
//https://blog.csdn.net/kuangshp128/article/details/121139091
//用户表 sys_user
type SysUserEntity struct {
UserId int `gorm:"column:user_id"`
UserName string `gorm:"column:user_name"`
NickName string `gorm:"column:nick_name"`
DeptId string `gorm:"column:dept_id"`
sex string `gorm:"column:sex"`
}
//单位表 sys_dept
type SysDeptEntity struct {
DeptId int `gorm:"column:dept_id"`
ParentId string `gorm:"column:parent_id"`
DeptName string `gorm:"column:dept_name"`
CreateBy string `gorm:"column:create_by"`
UpdateTime string `gorm:"column:update_time"`
}
func (SysUserEntity) TableName() string {
return "sys_user"
}
func (SysDeptEntity) TableName() string {
return "sys_dept"
}
func init() {
config.GormDb.AutoMigrate(&SysUserEntity{}, &SysDeptEntity{})
}
3.接口
UserController.go
/***
1.多表 联合 orm
*/
func GetByUserJoinList(c *gin.Context) {
//申明新对象
user := &entity.SysUserEntity{}
//获取分页参数
pageNum := c.Query("pageNum")
pageSize := c.Query("pageSize")
fmt.Println("分页参数分别为 :" + pageNum + "|" + pageSize)
list := dao.GetByUserJoinList(c, (*entity.SysUserEntity)(user))
i := len(list)
fmt.Print(i)
common.ReturnSucess(c, 200, "查询成功", list, int64(len(list)))
}
4.实现
//多表联合orm
func GetByUserJoinList(c *gin.Context, user *entity.SysUserEntity) []map[string]interface{} {
//查收过滤条件拼装
// var userName = user.UserName
//申明一个数组
//var userList []*User
var resultList []map[string]interface{}
err := config.GormDb.Model(&entity.SysUserEntity{}).Table("sys_user as user").Select("user.user_id as deptId", "user.user_name as userName", "user.nick_name nickName", "dept.dept_name as deptName").
Joins("LEFT JOIN sys_dept as dept on user.dept_id = dept.dept_id").Where("1 = 1").Scan(&resultList).Error
if err != nil {
log.Println("查询用户失败,原因:", err)
// 根据具体错误情况进行处理,比如记录日志、返回错误信息给调用者等
errToJson := MapToJson(err)
//主要错误信息提取
common.ReturnError(c, 500, /*err*/ errToJson, resultList, int64(len(resultList)))
panic("代码执行异常,不会进行下一步代码逻辑的调用,以及返回")
}
return resultList
}
5.正确返回数据截图
6.错误时的异常定义及返回
7.window环境打包成 .exe文件
在 mian.go 文件目录下 执行 go build main.go
7.2 运行打包完的
7.3 打包完的服务测试