本节笔记将讲述如何使用GORM连接MYSQL数据库,并实现数据的增删改查
ORM介绍
对象关系映射(英语: (Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
GORM 介绍
Gorm 是一个已经迭代了10年+的功能强大的 ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。
GORM的基本使用
安装
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)
}