GORM学习

发布时间 2023-12-01 15:50:44作者: DengSr

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)