使用GORM连接数据库 | 青训营

98 阅读3分钟

本节笔记将讲述如何使用GORM连接MYSQL数据库,并实现数据的增删改查

ORM介绍

对象关系映射(英语: (Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。 图片.png

GORM 介绍

Gorm 是一个已经迭代了10年+的功能强大的 ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

GORM的基本使用

图片.png

安装

go get -u github.com/jinzhu/gorm

连接数据库


//2.连接MySQL数据库  
db, err := gorm.Open("mysql", "root:123456789@(localhost:3306)/db1_ts?charset=utf8mb4&parseTime=True&loc=Local")  
if err != nil {  
panic(err)  
}  
defer db.Close()  

GORM Model定义

在使用ORM工具时,通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,在GORM中模型(Models)通常是正常定义的结构体、基本的go类型或它们的指针。
为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体。

// gorm.Model 定义
type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}

可以将它嵌入到你自己的模型中:

// 将 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`字段注入到`User`模型中
type User struct {
  gorm.Model
  Name string
}

使用db.AutoMigrate(&User{}) 把模型与数据库中的表对应起来 ,之后进行CRUD操作

练习

package main  
  
import (  
"github.com/jinzhu/gorm"  
_ "github.com/jinzhu/gorm/dialects/mysql"  
)  
  
// User 1.定义模型  
type User struct {  
gorm.Model  
Name string  
Age int64  
Active bool  
}  
  
func main() {  
//2.连接MySQL数据库  
db, err := gorm.Open("mysql", "root:123456789@(localhost:3306)/db1_ts?charset=utf8mb4&parseTime=True&loc=Local")  
if err != nil {  
panic(err)  
}  
defer db.Close()  
  
//3.把模型与数据库中的表对应起来  
db.AutoMigrate(&User{})  
  
//4.创建  
//u1 := User{Name: "jinzhu2", Age: 69, Active: true}  
//db.Create(&u1)  
//u2 := User{Name: "qimi2", Age: 90, Active: false}  
//db.Create(&u2)  
  
//5.一般查询  
var user User //声明模型结构体类型变量user  
//db.First(&user) //根据主键查询第一条记录  
//db.Take(&user) //随机获取一条记录  
//db.Last(&user) //查询最后一条记录  
db.First(&user, 2) //查询id为2的数据  
fmt.Printf("user:%#v\n", user)  
  
var users []User  
db.Find(&users) //查询所有记录  
fmt.Printf("users:%#v\n", users)

//6.更新  
//user.Name = "七米"  
//user.Age = 99  
//db.Debug().Save(&user) //Save默认修改所有字段  
//db.Debug().Model(&user).Update("name", "小王子") //Update只更新指定字段  
//  
//m1 := map[string]interface{}{  
// "name": "wangxaiomig",  
// "age": 28,  
// "active": true,  
//}  
//db.Debug().Model(&user).Updates(m1) //m1所列字段都会更新  
//db.Debug().Model(&user).Select("age").Updates(m1) //只更新age字段  
//db.Debug().Model(&user).Omit("active").Updates(m1) //排序m1中的active更新其他的值  
//  
//db.Debug().Model(&user).UpdateColumn("age", 30) //忽略钩子更新时间操作

//7.删除  
//var u = User{}  
//u.ID = 1  
//db.Debug().Delete(&u)  
  
//删除记录时,请确保主键字段有值,GORM 会通过主键去删除记录,  
//如果主键为空,GORM 会删除该 model 的所有记录。  
//u.Name = "qimi2" //这里主键为空,故GORM将数据库中未删除记录全部删除  
//db.Debug().Delete(&u)  
  
//只删除匹配条件的数据  
//db.Debug().Where("name=?", "jinzhu2").Delete(User{})  
  
//查看已被软删除的记录  
var u1 []User  
//db.Debug().Unscoped().Where("name=?", "jinzhu2").Find(&u1)  
//fmt.Println(u1)  
  
//物理删除  
db.Debug().Unscoped().Where("name=?", "jinzhu2").Delete(&u1)  
}

参考

bilibili七米老师GORM简明教程(推荐)
GORM/GEN中文文档
GORM入门指南
GORM的CRUD