这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
GORM
引入驱动
import "gorm.io/driver/mysql"
连接数据库
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
ds :="username:password(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(ds), &gorm.Config{})
}
连接mysql驱动需要参数,从左到右为用户名,密码,数据库对应的Ip地址和端口号,数据库名,编码格式。
GORM Model
结构体
type User struct {
ID uint
Name string
Email *string
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time //记录创建时间
UpdatedAt time.Time //记录更新时间
}
字段标签
- column 指定db列名
- primaryKey 指定列为主键
- unique 指定列为唯一
GORM操作mysql
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// UserInfo 用户信息
type UserInfo struct {
ID uint
Name string
Gender string
Hobby string
}
//自定义表名
func (UserInfo) TableName() string {
return "user"
}
func main() {
dsn:="root:123456@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err!= nil{
panic(err)
}
// 自动迁移
db.AutoMigrate(&UserInfo{})
u1 := UserInfo{1, "李华", "男", "篮球"}
u2 := UserInfo{2, "刘丽", "女", "足球"}
// 创建记录
db.Create(&u1)
db.Create(&u2)
// 查询
var u = new(UserInfo)
db.First(u)
fmt.Printf("%#v\n", u)
var uu UserInfo
db.Find(&uu, "hobby=?", "足球")
fmt.Printf("%#v\n", uu)
// 更新
db.Model(&u).Update("hobby", "双色球")
// 删除
db.Delete(&u)
}
CRUD接口
创建记录
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
db.Create(&user)
插入数据
func InsertStu(user model.Student) error {
deres := db.Select("Name", "Password", "MajorNum").Create(&model.Student{Name: user.Name, Password: user.Password, MajorNum: user.MajorNum})
err := deres.Error
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return err
}
return err
}
删除数据
func DeleteTCourse(id int) error {
var Course []model.TCourse
dbRes := db.Where("Id = ?", id).Delete(&Course)
err := dbRes.Error
if err != nil {
fmt.Printf("delete failed, err:%v\n", err)
return err
}
return err
}
数据更改
func UpdateStuPassword(id int, newPassword string) error {
deRes := db.Model(&model.Student{}).Where("Id = ?", id).Update("Password", newPassword)
err := deRes.Error
if err != nil {
fmt.Printf("update failed, err:%v\n", err)
return err
}
return err
}
数据查询
func SelectQuestionByStuId(id int) string {
user := model.Student{}
db.Model(&model.Student{}).Select("question").Where("Id = ?", id).Find(&user)
return user.Question
}
事务实现
func InsertStuCourse(course model.StuCourse, credit float64) error {
stu := model.Student{}
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Select("StudentNum", "TCourseNum", "Time").Create(&model.StuCourse{StudentNum: course.StudentNum, TCourseNum: course.TCourseNum, Time: course.Time}).Error; err != nil {
return err
}
if err := tx.Model(&model.TCourse{}).Where("id = ?", course.TCourseNum).Update("Num", gorm.Expr("Num + 1")).Error; err != nil {
return err
}
if err := tx.Model(&model.Student{}).Where("id = ?", course.StudentNum).Update("Credit", gorm.Expr("Credit + ?", credit)).Error; err != nil {
return err
}
if err := tx.Model(&model.Student{}).Select("Credit").Where("id = ?", course.StudentNum).Find(&stu).Error; err != nil {
return err
}
fmt.Println(stu.Credit)
if stu.Credit >= 28 {
tx.Rollback()
}
return nil
})
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return err
}
return err
}