这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
本文开始,将进行Gorm的学习,仍然是记录学习时使用的代码例子
本项目结果目前如下:
项目使用的数据库是MySQL。安装完gorm后,也要安装MySQL的驱动
model目录下放了几个结构体作为实例model,main下即是main函数
Users代码如下
type Users struct {
ID int `gorm:"column:userId;primaryKey"`
UserName string `gorm:"column:userName"`
UserPassword string `gorm:"column:userPassword"`
//gorm.Model `gorm:"-"`
CreatedAt time.Time `gorm:"column:createAt;"`
}
UserInfo代码如下
type UserInfo struct {
InfoId int `gorm:"primaryKey,column:InfoId"`
Info string `gorm:"column:Info"`
}
数据库结构如下
请看表结构
users表
userInfo表(虽然不重要)
请看Main函数
涉及非常多,但无非是两部分,数据的创建插入与查找,数据的修改与删除回头再写
代码中有许多对于方法的注释与个人理解,此处不再赘述
想要运行某部分时,请将对应部分的注释代码块删去即可进行运行
package main
import (
"Gorm1/model"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func insertUser(id int, userName string, userPassword string, hasId bool, db *gorm.DB) {
user1 := model.Users{}
user1.UserName = userName
user1.UserPassword = userPassword
if hasId {
user1.ID = id
}
result := db.Create(&user1)
if result.Error != nil {
fmt.Println("Insert ERROR!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
return
}
fmt.Println(result.RowsAffected)
}
func main() {
dsn := "root:root@tcp(localhost:3306)/userLogin"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println("Connection ERROR!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
return
}
//insertUser(0, "Hi", "hhh", false, db)
//insertUser(5, "HiHi", "hhh", true, db)
/**
user1 := model.Users{
ID: 6,
UserName: "a",
UserPassword: "aa",
CreatedAt: time.Time{},
}
*/
//创建记录并更新给出的字段。
//创建一个记录且一同忽略传递给略去的字段值。
//db.Select("UserName", "UserPassword").Create(&user1)
//db.Omit("UserName").Create(&user1)
//插入多个
//通过切片传给create
//var users = []model.Users{{UserName: "first"}, {UserName: "second"}, {UserName: "third"}}
//db.Create(&users)
//通过CreateInBatches方法
/**
var users2 = []model.Users{{UserName: "first1"}, {UserName: "second2"}, {UserName: "third3"}}
//两个参数,第一个是切片好理解,第二个参数是每批插入数量,比如现在是1,每批插入1个插入三次
db.CreateInBatches(users2, 1)
*/
/**
//Hook函数
var user1 = User{
UserName: "OK",
UserPassword: "OKK",
}
db.Create(&user1)
*/
//查询
/**
//一般查询
user3 := model.Users{}
// SELECT * FROM `users` ORDER BY `users`.`userId` LIMIT 1
db.Debug().First(&user3)
fmt.Println(user3)
user4 := model.Users{}
// SELECT * FROM `users` ORDER BY `users`.`userId` DESC LIMIT 1
db.Debug().Last(&user4)
fmt.Println(user4)
user5 := model.Users{}
// SELECT * FROM `users` LIMIT 1
db.Debug().Take(&user5)
fmt.Println(user5)
//以下三个根据特定主键查询
//SELECT * FROM `users` WHERE `users`.`userId` = 10 ORDER BY `users`.`userId` LIMIT 1
user6 := model.Users{}
db.Debug().First(&user6, 10)
fmt.Println(user6)
//SELECT * FROM `users` WHERE `users`.`userId` = '15' ORDER BY `users`.`userId` LIMIT 1
user7 := model.Users{}
db.Debug().First(&user7, "15")
fmt.Println(user7)
//声明切片查询全部
// SELECT * FROM `users` WHERE `users`.`userId` IN (5,6,7) ORDER BY `users`.`userId` LIMIT 1
var user8 []model.Users
db.Debug().Find(&user8, []int{5, 6, 7})
fmt.Println(user8)
*/
/**
//where,or与not查询
//查询一个
// SELECT * FROM `users` WHERE userName=7 ORDER BY `users`.`userId` LIMIT 1
user3 := model.Users{}
//请注意此处的query必须和数据库中名称一样,而不是结构体中的命名
db.Where("userName=?", 7).Debug().First(&user3)
fmt.Println(user3)
//查询所有符合条件
//SELECT * FROM `users` WHERE userName='aaaa'
var user4 []model.Users
db.Where("userName=?", "aaaa").Debug().Find(&user4)
fmt.Println(user4)
//还可以查询in like and between 等许多
//查询struct与map
//传入struct
var user5 = model.Users{
UserName: "8",
}
//注意,此处where的参数为一个带有要查询参数的结构体,First参数为返回的结构体,二者不为同一个
//SELECT * FROM `users` WHERE `users`.`userName` = '8' ORDER BY `users`.`userId` LIMIT 1
db.Where(&user5).Debug().First(&user5)
fmt.Println(user5)
//map查询
//大同小异,只是where参数为map
var user6 []model.Users
// SELECT * FROM `users` WHERE `userName` = '9' AND `userPassword` = '9' ORDER BY `users`.`userId` LIMIT 1
db.Where(map[string]interface{}{"userName": "9", "userPassword": "9"}).Debug().First(&user6)
fmt.Println(user6)
//slice查询
var user7 []model.Users
// SELECT * FROM `users` WHERE `users`.`userId` IN (5,8)
db.Where([]int64{5, 8}).Debug().Find(&user7)
fmt.Println(user7)
//not查询与where类似
var user8 = []model.Users{}
//SELECT * FROM `users` WHERE NOT userName='aaaa'
db.Not("userName=?", "aaaa").Debug().Find(&user8)
for _, users := range user8 {
fmt.Println(users)
}
//or的使用
//SELECT * FROM `users` WHERE userName='FUCKYOU!' OR userName='9'
var user9 = model.Users{}
db.Where("userName=?", "FUCKYOU!").Or("userName=?", "9").Debug().Find(&user9)
fmt.Println(user9)
//内联条件与where类似
//SELECT * FROM `users` WHERE userName <>'aaaa' and userPassword <>'null'
var user10 = []model.Users{}
db.Find(&user10, "userName !=? and userPassword <>?", "aaaa", "null")
for _, users := range user10 {
fmt.Println(users)
}
*/
//选取特定字段Select,内部为类别名称,后面使用Order对类进行排序,Table选择表
// SELECT `userId`,`userName`,`userPassword` FROM `users` ORDER BY userId desc
var users []model.Users
db.Table("users").Select("userId", "userName", "userPassword").Order("userId desc").Debug().Find(&users)
fmt.Println(users)
//其他
//Limit与Offset,前者为检索出最大记录数量,后者为偏移数即忽略数量,Count获取记录总数
//Joins链接查询
//Pluck,查询 model 中的一个列作为切片,如果您想要查询多个列,您应该使用 Scan
//Scan扫描结果至一个struct
}
// User 与 Hook函数
type User struct {
UserName string `gorm:"column:userName"`
UserPassword string `gorm:"column:userPassword"`
}
func (u *User) BeforeCreate(db *gorm.DB) (err error) {
fmt.Println("Inserting...")
return err
}
我参考了几篇文章,如下
参考文章1->>>>查询 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
参考文章2->>>>