go框架三件套gorm | 青训营笔记

66 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天。

📜📜📜今天学习的是go框架三件套之——gorm。

1. ⚓Gorm是ORM框架

【对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。

ORM框架:为了解决面型对象与关系数据库存在的互不匹配的现象的框架。】

Grom的基础使用

 

image.png 返回的字符串就是表名

image.png Map可以更新0值

 

image.png

{我使用的是mysql,要使用gorm,先创建一个项目,使用 go mod 进行依赖包管理。

 

image.png 报错:

 

image.png 报错原因:
在国内使用 go get 、go install、go mod 等命令下载相应的包或依赖时经常会出现 timeout 等问题。我们可以通过设置代理GOPROXY 来解决这个问题。如果设置了代理GOPROXY ,下载源代码时将会通过这个设置的代理地址,而不再是以前的直接从代码库下载。
如果你使用的 Go 版本>=1.13, 你可以通过设置 GOPRIVATE 环境变量来控制哪些私有仓库和依赖(公司内部仓库)不通过 proxy 来拉取,直接走本地

image.png 安装成功截图:

image.png powershell和cmd区别:1、CMD写的BAT脚本我们看作是面向过程的,而PowerShell则是面向对象的,是一种站在使用者的角度进行脚本的编写;2、CMD只能执行基本的任务,PowerShell因为是基于【.NET】面向对象的。

建立连接

image.png  

 

image.png

DSN(数据源名称)

数据源名称具有通用格式,例如 PEAR DB 使用它,但没有类型前缀(可选部分用方括号标记):

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...paramN=valueN]

完整形式的DSN:

username:password@protocol(address)/dbname?param=value

除数据库名称外,所有值都是可选的。因此,最小 DSN 为:

/dbname

如果不想预先选择数据库,请留空:dbname

/

这与空 DSN 字符串具有相同的效果:

 

或者,Config.FormatDSN 可用于通过填充结构来创建 DSN 字符串。

(让网页可以知道数据库所在的位置以及数据库相关的属性。)

Grom创建数据

 

  image.png

2.gorm实战

2.1安装

"gorm.io/driver/mysql"//这个是导入驱动库
"gorm.io/gorm"//这个是导入gorm库

安装之后,便可以使用import关键字导入上方的库。

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

下面连接数据库

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	// dsn := "root:123456@tcp(127.0.0.1:3306)/go_use?charset=utf8mb4&parseTime=True&loc=Local"
	//root:数据库用户名,123456:密码,后面是数据库ip,go_use是数据库名
	dsn := "root:123456@tcp(127.0.0.1:3306)/go_use?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	fmt.Println(db)
	fmt.Println(err)
}

运行结果: image.png

CDUR是自己运行过的:


package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Name string
	Age  int
	//Birthday time.Time
}

func (u User) Tablename() string {
	return "user"
}

func main() {

	// dsn := "root:123456@tcp(127.0.0.1:3306)/go_use?charset=utf8mb4&parseTime=True&loc=Local"
	//root:数据库用户名,123456:密码,后面是数据库ip,go_use是数据库名
	dsn := "root:123456@tcp(127.0.0.1:3306)/go_use?parseTime=True&charset=utf8&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		v := "连接失败!"
		panic(v)
	}

	//create
	//db.Create(&User{Name: "hjj", Age: 18})

	//read
	var user1 User
	//var user User
	//db.First(&user1, "Name = ?", "haha")
	db.First(&user1)
	fmt.Println(user1.Age)
	fmt.Println(user1)

	//updata
	//db.Model(&user1).Update("Age", 20)-user1得到的是一个结构体,而且没有主键
	db.Model(&User{}).Where("name = ?", "hjj").Update("name", "hello")

	//delete
	db.Delete(&User{}, "Name = ?", "hello")
}

这里在update和delete花了一些时间,遇到了以下的问题:

  1. go model定义的时候字段的首字母要大写——
  2. read得到的是一个结构体,而且好像不包括主键,不能用读的内容,update和delete
  3. 注意看报错内容,缺内容或者是写错了,报错写得还挺清楚,实在不知道哪里有问题就上官网吧。