首页 > 其他分享 >GORM学习

GORM学习

时间:2023-12-01 15:59:06浏览次数:36  
标签:fmt DB gorm 学习 studentList student Println GORM

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 := "[email protected]"
	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 := "[email protected]"
	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", "[email protected]")

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)

  

 

标签:fmt,DB,gorm,学习,studentList,student,Println,GORM
From: https://www.cnblogs.com/99wsr/p/17867983.html

相关文章

  • 通过PowerShellPlus示例脚本学习PowerShell-使用SMO创建MSSQL任务
    ##=====================================================================##Title:Create-MSSQLJob-UsingSMO##Description:CreateadailySQLjobtocallapowershellscript##Author:Idera##Date:9/1/2008##Input:-serve......
  • 解锁机器学习-梯度下降:从技术到实战的全面指南
    本文全面深入地探讨了梯度下降及其变体——批量梯度下降、随机梯度下降和小批量梯度下降的原理和应用。通过数学表达式和基于PyTorch的代码示例,本文旨在为读者提供一种直观且实用的视角,以理解这些优化算法的工作原理和应用场景。关注TechLead,分享AI全维度知识。作者拥有10+年互......
  • 解锁机器学习-梯度下降:从技术到实战的全面指南
    本文全面深入地探讨了梯度下降及其变体——批量梯度下降、随机梯度下降和小批量梯度下降的原理和应用。通过数学表达式和基于PyTorch的代码示例,本文旨在为读者提供一种直观且实用的视角,以理解这些优化算法的工作原理和应用场景。关注TechLead,分享AI全维度知识。作者拥有10+年......
  • 【Nginx38】Nginx学习:SSL模块(二)错误状态码、变量及宝塔配置分析
    Nginx学习:SSL模块(二)错误状态码、变量及宝塔配置分析继续我们的SSL模块的学习。上回其实我们已经搭建起了一个HTTPS服务器了,只用了三个配置,其中一个是listen的参数,另外两个是指定密钥文件的地址,一个是crt文件,一个是key文件。今天我们将学习到的是SSL中的错误状态码、变......
  • 20211314王艺达学习笔记12
    第十四章MySQL数据库系统知识点总结一、MySQLMySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统......
  • 学习笔记3:JavaSE & API(异常处理)
    1、Java中的错误(1)所有错误的超类:Throwable(2)Throwable的子类:子类:Error,系统级别错误、运行环境错误。比如,虚拟机内存溢出。子类:Exception,异常情况,通常是逻辑问题导致的程序级别错误,可在运行期间被解决。比如,空指针,下标越界。(3)通常,程序中处理的异常都是Exception。(4)错误输出:S......
  • 学习笔记12
    第14章MySQL数据库系统摘要本章讨论了MySQL关系数据库系统;介绍了MySQL并指出了它的重要性;展示了如何在Linux机器上安装和运行MySQL;演示了如何使用MySQL在命令模式和批处理模式下使用SQL脚本创建和管理数据库;说明了如何将MySQL与C编程相结合;演示了如何将MySQL与PHP集......
  • Apache Paimon流式湖仓学习交流群成立
    ApachePaimon是一个流式数据湖平台。致力于构建一个实时、高效的流式数据湖平台。这个项目采用了先进的流式计算技术,使企业能够实时处理和分析大量数据。ApachePaimon的核心优势在于它对于大数据生态系统中流式处理的支持,尤其是在高并发和低延迟方面表现出色。目前业界主流数......
  • Golang学习笔记-定时任务
    指定具体时间执行packagemainimport( "fmt" "time")funcmain(){ //指定执行时间为2023-11-2900:00:00 executionTime:=time.Date(2023,time.November,29,0,0,0,0,time.UTC) //当前时间 now:=time.Now().UTC() //计算距离执行时间的持续时间 d......
  • 前端学习-JavaScript学习-js基础-API01
    学习视频:黑马程序员视频链接DOM简介DOM简介DOM树:将HTML文档标签以树状形式表现出来DOM对象:每个标签都是DOM对象DOM核心思想:将网页内容当作对象处理DOM中最大的对象:document,其次是<html><!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metan......