func
init
()
{
var
err
error
sqlStr :=
"root:123456@tcp(localhost:3306)/beego?charset=utf8mb4&parseTime=true&loc=Local"
GormDb, err = gorm.Open(mysql.Open(sqlStr), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
NamingStrategy: schema.NamingStrategy{
SingularTable:
true
,
if
err !=
nil
{
fmt.Println(
"数据库连接错误"
, err)
return
3、封装一个将
map
转换为字符串的方法
import "encoding/json"
func MapToJson(data interface{}) string {
byteStr, _ := json.Marshal(data)
return string(byteStr)
二、一对一的关联关系
1、参考文档,建议大家先阅读文档
2、这里就不使用官网案例,直接使用用户和身份证号码的两个表来举例,一个用户只有一个身份证号码,一个身份证号码也只能属于一个用户
3、创建数据模型并且自动映射生成到数据库中
type UserEntity struct {
Id int `json:"id" gorm:"type:int(11);autoIncrement;primaryKey;column:id;"`
Name string `json:"name" gorm:"type:varchar(30);not null;"`
Age int `json:"age" gorm:"type:int(11);default:0;"`
type IdCardEntity struct {
Id int `json:"id" gorm:"type:int(11);autoIncrement;primaryKey;column:id;"`
No string `json:"no" gorm:"type:varchar(20);not null;"`
User UserEntity `json:"user"`
UserId int `json:"user_id"`
func (UserEntity) TableName() string {
return "user"
func (IdCardEntity) TableName() string {
return "id_card"
func init() {
utils.GormDb.AutoMigrate(&UserEntity{}, &IdCardEntity{})
4、映射生成的数据表结构如下
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | <null> | |
| name | varchar(30) | NO | | <null> | |
| age | int(11) | YES | | 0 | |
+
+
| Field | Type | Null | Key | Default | Extra |
+
| id | int(11) | NO | PRI | <null> | |
| no | varchar(20) | NO | | <null> | |
| user_id | int(11) | YES | MUL | <null> | |
+
5、使用Joins
的方式连表的方式查询用户及身份证号码出来
var userListEntity []map[string]interface{}
utils.GormDb.Model(&UserEntity{}).Select("user.id", "user.name", "user.age", "id_card.no").
Joins("left join id_card on user.id = id_card.user_id").Scan(&userListEntity)
fmt.Println(tools.MapToJson(userListEntity))
[{"age":10,"id":1,"name":"张三","no":"110"}]
6、使用Preload
反向在身份证表中去查询用户信息
var idCardListEntity []IdCardEntity
utils.GormDb.Preload("User").Find(&idCardListEntity)
fmt.Println(tools.MapToJson(idCardListEntity))
[{"id":1,"no":"110","user":{"id":1,"name":"张三","age":10},"user_id":1}]
三、一对多的关联关系
1、官网地址,自行观看官网内容
2、这里我们举例班级和学生的关联关系,一个班级有多个学生,学生只能属于一个班级的案例
3、创建数据模型
type ClassEntity struct {
Id int `json:"id" gorm:"type:int(11);autoIncrement;primaryKey;column:id;`
Name string `json:"name"`
StudentList []*StudentEntity `json:"student_list" gorm:"foreignKey:ClassId"`
type StudentEntity struct {
Id int `json:"id" gorm:"type:int(11);autoIncrement;primaryKey;column:id;`
Name string `json:"name"`
ClassId int `json:"class_id"`
func (StudentEntity) TableName() string {
return "student"
func (ClassEntity) TableName() string {
return "class"
func init() {
utils.GormDb.AutoMigrate(&ClassEntity{}, &StudentEntity{})
4、自己手动插入数据
5、查询班级列表并且查询全部的学生出来
var classList []ClassEntity
utils.GormDb.Preload("StudentList").Find(&classList)
fmt.Println(tools.MapToJson(classList))
[{"id":1,"name":"班级一","student_list":[{"id":1,"name":"学生一","class_id":1},{"id":2,"name":"学生二","class_id":1}]}]
6、查询学生想顺带查询出班级
学生表上添加一个字段(直接添加就可以)
type StudentEntity struct {
Id int `json:"id"`
Name string `json:"name"`
+ Class ClassEntity `json:"class"`
ClassId int `json:"class_id"`
var studentList []StudentEntity
utils.GormDb.Joins("Class").Find(&studentList)
fmt.Println(tools.MapToJson(studentList))
[{"id":1,"name":"学生一","class":{"id":1,"name":"班级一","student_list":null},"class_id":1},{"id":2,"name":"学生二","class":{"id":1,"name":"班级一","student_list":null},"class_id":1}]
Id int `json:"id"`
Name string `json:"name"`
Roles []*RoleEntity `json:"roles" gorm:"many2many:account_role;foreignKey:Id;joinForeignKey:accountId;joinReferences:roleId;"`
type RoleEntity struct {
Id int `json:"id"`
Title string `json:"title"`
Accounts []*AccountEntity `json:"accounts" gorm:"many2many:account_role;foreignKey:Id;joinForeignKey:roleId;joinReferences:accountId"`
func (AccountEntity) TableName() string {
return "account"
func (RoleEntity) TableName() string {
return "role"
func init() {
utils.GormDb.AutoMigrate(&AccountEntity{}, &RoleEntity{})
4、上面几个用到的字段解析说明,官网介绍地址
many2many:user_profiles
定义中间表名为:user_profiles
foreignKey
:Id
使用当前表的id
作为外键
joinForeignKey:accountId
当前数据模型外键关联到中间件表的字段名叫accountId
joinReferences:roleId
反向引用字段,如果是账号表就要写中间表的roleId
5、手动添加数据库
6、查找账号列表顺便查询出角色信息
var accountList []AccountEntity
utils.GormDb.Preload("Roles").Find(&accountList)
fmt.Println(tools.MapToJson(accountList))
"id":1,
"name":"账号一",
"roles":[
{"id":1,"title":"角色一","accounts":null},
{"id":2,"title":"角色二","accounts":null}
"id":2,
"name":"账号二",
"roles":[
{"id":1,"title":"角色一","accounts":null}
7、根据角色查询到账号信息
var roleList []RoleEntity
utils.GormDb.Preload("Accounts").Find(&roleList)
fmt.Println(tools.MapToJson(roleList))
"id":1,
"title":"角色一",
"accounts":[
{"id":1,"name":"账号一","roles":null},
{"id":2,"name":"账号二","roles":null}
"id":2,
"title":"角色二",
"accounts":[
{"id":1,"name":"账号一","roles":null}
五、数据模型
上面仅仅是演示使用关于数据模型的完善需要自己参考官网,链接地址
水痕001
软件工程师
粉丝