Day1:GORM入门
1.环境的安装
在项目文件的terminal中输入下面两条命令进行gorm安装
go get gorm.io/driver/mysql go get gorm.io/gorm
2.安装好之后使用以下代码进行检测,其中的地址拼接是重点
"%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout
func init() {
username := "root" //账号
password := "147258" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "gorm" //数据库名
timeout := "10s" //连接超时,10秒
// root:root@tcp(127.0.0.1:3306)/gorm?
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "f_", // 表名前缀
NoLowerCase: false, // 关闭小写转换
},
})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
// 连接成功
fmt.Println(db)
DB = db
}
3.连接数据库的重点语句是gorm.open(数据库类型.open(数据库拼接地址)),在Open中添加&gorm.config(根据需求添加相关配置)
例如数据表命名的策略如下所示
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "f_", // 表名前缀
SingularTable: false, // 单数表名
NoLowerCase: false, // 关闭小写转换
},
})
4.打印日志的三种方式
1.DB.Debug().AutoMigrate(&Student{})
2.展示部分日志:var model Student session := DB.Session(&gorm.Session{Logger: newLogger})
session.First(&model)
3.var mysqlLogger logger.Interface
// 要显示的日志等级 mysqlLogger = logger.Default.LogMode(logger.Info)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: mysqlLogger, })
Day2:GORM模型定义、单表操作
一、模型定义
1.当自动创建表的结构太大时,可以使用gorm:size:大小,进行操作,如下图所示

操作方式,实现结果如下:



字段标签,将gorm后面的size替换下面指令就行
type 定义字段类型
size 定义字段大小
column 自定义列名
primaryKey 将列定义为主键
unique 将列定义为唯一键
default 定义列的默认值
not null 不可为空
embedded 嵌套字段
embeddedPrefix 嵌套字段前缀
comment 注释
多个标签之前用 ; 连接
二、单表操作
1.使用DB.create(interface{})进行插入数据
DB.AutoMigrate(&students{})
email := "123456@qq.com"
s := students{
Name: "xx",
Age: 22,
Gender: false,
Email: &email,
}
DB.Create(&s)
2.批量插入
for i := 0; i < 10; i++ {
studentsList = append(studentsList, students{
Name: fmt.Sprintf("Robot%d号", i+1), //使用Sprintf可以拼接字符串
Age: 22,
Gender: true,
Email: nil,
})
}
DB.Create(&studentsList)
3.单表查询
var student students
DB.Take(&student) //查询一个student数据
fmt.Println(student)
DB = DB.Session(&gorm.Session{Logger: mysqlLogger}) //打印操作日志
var studentList []students //查询所有students的数据
DB.Take(&studentList)
fmt.Println(studentList)
DB.First(&studentList)
fmt.Println(studentList)
DB.Last(&studentList)
fmt.Println(studentList)
4.根据主键查询
//根据主键查询,查询主键为3的数据 DB.Take(&studentList, 3) //第二个参数是主键位置 fmt.Println(studentList)
5.根据其他条件查询
//根据其他条件查询,查询名字为Robot5号的信息
err := DB.Take(&studentList, "name=?", "Robot5号").Error
switch err {
case gorm.ErrRecordNotFound:
fmt.Println("没有找到")
default:
fmt.Println("sql错误")
}
fmt.Println(studentList)
6.根据结构体查询
var student students student.ID = 3 DB.Take(&student) fmt.Println(student)
7.查询多条记录
count := DB.Find(&studentList).RowsAffected //获取查询的记录数
fmt.Println(count)
for _, student := range studentList {
data, _ := json.Marshal(student)
fmt.Println(string(data))
}
8.根据主键查询多条记录
//DB.Find(&studentList, []int{1, 3, 5, 7})
//DB.Find(&studentList, 1, 3, 5, 7) // 一样的
//fmt.Println(studentList)
9.根据其它条件查询多条记录
DB.Find(&studentList, "name in ?", []string{"Robot3号", "xx"})
fmt.Println(studentList)
三、更新表操作
1.更新所有字段,指定字段
//更新所有字段 var student students email := "123456789@qq.com" DB.Take(&student) //获取第一个数据 student.Age = 18 //更改第一个数据的年龄 student.Email = &email student.XXX=xxx
//使用select更新指定字段
DB.Select("age").Save(&student) //重新提交数据库
DB.Save(&student) //重新提交数据库
2.批量更新
//批量更新
var studentList []students
DB.Find(&studentList, "age=?", 22).Update("email", "is22@qq.com")
3.更新多列
var studentList []students
DB.Model(&studentList).Where("age=?", 22).Updates(map[string]any{
"name": "坨哥",
"gender": false,
})
4.根据ID删除
//根据ID删除行数据 var student students DB.Delete(&student, 4)