后端go整合gorm笔记 | 青训营笔记

340 阅读3分钟

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

一:gorm简介:

gorm是go语言中操作数据库的一个框架,在当今的go的编写中占据主要地位。Golang写的,GitHub上活跃度很高的orm库,比较推荐在开发中进行使用。

二:gorm连接:

连接数据库(grom2.0),首先终端中输入如下代码,导入gorm库,以下MySQL为例

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

接着在程序中配置gorm

var db *gorm.DB

func init() {
    //init函数是在main函数运行前运行的函数
	//grom 2。0 之后的连接方式
	dsn := "root:123456@tcp(127.0.0.1:3306)/gin?charset=utf8&parseTime=True&loc=Local"
	b, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return
	}
	db = b
}

由于我们在项目开发中,要不断对数据库进行操作,因此我们首先定义一个全局变量db,之后gorm的函数Open()得到的直接赋予db便于之后的使用。

三:gorm的CRUD:

1、增加

①.最基本的创建方法

定义一个实体对象,然后调用creat() 函数将该对象的地址传进去

var user = User{
	Model:    gorm.Model{},
	Name:     "lizi",
	Age:      20,
	Birthday: time.Now(),
}
func insert1() {

	result := db.Create(&user)
	id := user.ID
	fmt.Println("id= ", id)
	row := create.RowsAffected
	fmt.Println("row=", row) //row= 1
}

user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数

②.选定指定列插入

定义一个实体对象,然后调用select().creat() 函数将要插入的列名传入(注意要跟你结构体的名字相同,不要看数据库的名字)

var user = User{
	Model:    gorm.Model{},
	Name:     "lizi",
	Age:      20,
	Birthday: time.Now(),
}
func insert2() {
	//选择指定列插入
	db.Select("Name", "Age", "CreatedAt").Create(&user)
}

③.一次插入多个(grom2.0的新特性)

创建一个切片,之后将该切片地址通过调用Creat() 函数插入数据库中去

func insert3() {
	var users = []User{
		{Name: "test01", Birthday: time.Now()},
		{Name: "test02", Birthday: time.Now()},
		{Name: "test03", Birthday: time.Now()},
	}
	db.Create(&users)
}

④.插入map对象

func insert4() {
	db.Model(&User{}).Create(map[string]interface{}{
		"Name": "zhuzhu",
        "Age": 18, 
        "Birthday": time.Now(),
	})
}

2.删除

①.软删除

go语言中的删除并不是真的删除,他是在delete_id的字段上删除,是软删除

加入条件删除

func delete1() {
    var user User
    db.Where("name=?", "lizi").Delete(&user)
    fmt.Println(user)
}

根据主键删除

func del2() {
    db.Delete(&User{}, 8)
}

②.真正意义上的删除(Unscoped() )

func del3() {
    db.Unscoped().Delete(&User{}, 6)
}

3.更新

①.拿到对象后整体更新,在保存

db.First(&user)
user.Name = "jinzhu 2"
user.Age = 100
db.Save(&user)

②.直接更新

更新一列

Update("name", "hello") 第一个参数是更新字段名,第二个参数是更新内容

func up1() {
    db.Model(&User{}).Where("name=?", "test02").Update("age", 20)
}

更新多列

Updates() 里面传入的是interface{}类型

func up2() {
    db.Model(&User{}).Where("name=?", "test02").Updates(User{Name: "lizizi", Age: 99})
}

4.查询

①.First 和 Last

分别对应查询第一个和最后一个

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1

②.Find (主要)

获取对象所有信息

这个获取该数据库的一行所有信息

func find3() {
    //查询所有名字为test01的对象
    var users []User
    db.Where("name=?", "test01").Find(&users)
    for _, user := range users {
        fmt.Println(user)
        fmt.Println("****************")
    }
}

获取对象指定信息

首先要新建一个结构体对象,包含你要获取的信息,类似java API

type User struct {
    gorm.Model
    Name     string    `json:"name" gorm:"size:255"`
    Age      int       `json:"age" gorm:"size:255"`
    Birthday time.Time `json:"birthday" gorm:"size:255"`
}
type APIUser struct {
    Name     string    `json:"name" gorm:"size:255"`
    Age      int       `json:"age" gorm:"size:255"`
    Birthday time.Time `json:"birthday" gorm:"size:255"`
}
func find4() {
    var apiuser APIUser
    db.Model(&User{}).Find(&apiuser)
    fmt.Println(apiuser)
}
​