gorm中文官方文档 https://jasperxu.com/Programming/Golang/GORM/
另外一个文档 https://learnku.com/docs/gorm/v2/index/9728

什么是orm

  • 一种数据库操作辅助工具
  • 在我们go的结构体和数据库之间产生映射,让我们对数据库的关系,表的内容,直观的体现在结构体上
  • 使用结构体即可完成增删改查操作

如何连接数据库

  1. 引入gorm包 github.com/jinzhu/gorm
  2. 引入mysql驱动包 github.com/go-sql-driver/mysql
  3. 首次建立一个数据库连接,代码如下
package main

import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

func main() {
	db, err := gorm.Open("mysql",
		"root:123456@/ginclass?charset=utf8mb4&parseTime=True&loc=Local")
	defer db.Close()

	if err != nil {
		panic(err)
	}
}

用grom建表

用db.AutoMigrate去建表,说明:db.AutoMigrate会自动判断表是否存在,如果不存在则建表。

package main

import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

type HelloWorld struct {
	gorm.Model
	Name string
	Sex  bool
	Age  int
}

func main() {
	db, err := gorm.Open("mysql",
		"root:123456@/ginclass?charset=utf8mb4&parseTime=True&loc=Local")
	defer db.Close()

	if err != nil {
		panic(err)
	}
	//db.AutoMigrate判断是否存在表,如果不存在则自动创建
	db.AutoMigrate(&HelloWorld{})
}

HelloWorld结构体中的gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体,建表时会自动创建这些字段。

建表后结构如下

gorm 连接mysql数据库的方式 gorm操作数据库_字段


建完表后来进行一些基本的增删改查操作。

增操作

用db.Create来创建一条数据Name为kaka,Sex为true, Age为21的数据

package main

import (
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

type HelloWorld struct {
	gorm.Model
	Name string
	Sex  bool
	Age  int
}

func main() {
	db, err := gorm.Open("mysql",
		"root:123456@/ginclass?charset=utf8mb4&parseTime=True&loc=Local")
	defer db.Close()
	if err != nil {
		panic(err)
	}
	//db.AutoMigrate判断是否存在表,如果不存在则自动创建
	db.AutoMigrate(&HelloWorld{})
	//创建数据
	db.Create(&HelloWorld{
		Name: "kaka",
		Sex:  true,
		Age:  21,
	})
}

运行后可以看到在表中多了一条数据。

gorm 连接mysql数据库的方式 gorm操作数据库_字段_02


我们再随便创建两条数据来查下。

查操作

  1. db.First方法使用
    我们用db.First来查数据库里的第一条数据

    运行后结果如下

    指定条件进行查询
    查询结果如下
  2. db.Find方法使用
    注意:db.Find的时候要接受的是一个切片的地址
    代码如下

    打印结果如下

    可以看到不加条件的话db.Find把所有结果都查出来了。
    我们加上where sex = false条件来查询下
    代码如下
    结果如下

    一般在实际开发过程中会把where写在前面,示例如下

    or语句比较简单可以在where里面写或者db.where().Or.Find()

改操作

db.Update()修改单个字段

将helloworld表中id为1的数据中的name字段的值改成Jack

代码如下

gorm 连接mysql数据库的方式 gorm操作数据库_mysql_03


db.Updates()来修改多个字段

gorm 连接mysql数据库的方式 gorm操作数据库_gorm 连接mysql数据库的方式_04


Updates(HelloWorld{})里面如果是一个空属性,比如age=0,或者Name=“”, 或者sex=false,则这些字段不会被修改。如果想要修改把字段改成这些空属性,比如将Age改成0,则要加一个map

代码如下

gorm 连接mysql数据库的方式 gorm操作数据库_mysql_05


如果要修改多条数据,比如id in 1,2的都改下

代码如下

gorm 连接mysql数据库的方式 gorm操作数据库_字段_06


注意First方法里要加切片

删操作

用db.Delete方法

gorm 连接mysql数据库的方式 gorm操作数据库_gorm 连接mysql数据库的方式_07


但是这个删除是软删除,见下图

gorm 连接mysql数据库的方式 gorm操作数据库_字段_08


删除id为1和2的数据,代码如下

gorm 连接mysql数据库的方式 gorm操作数据库_golang_09


这个也是软删除,如果想进行硬删除要加上Unscoped()方法

代码如下

gorm 连接mysql数据库的方式 gorm操作数据库_数据_10

总结

  • 创建连接
  • db, err := gorm.Open(“mysql”,
    “root:123456@/ginclass?charset=utf8mb4&parseTime=True&loc=Local”)
    defer db.Close()
  • 建表
  • 先定义一个结构体比如HelloWorld
  • 然后db.AutoMigrate(&HelloWorld{})来建表
  • 增操作
  • db.Create(&HelloWorld{
    Name: “kaka”,
    Sex: true,
    Age: 21,
    })
  • &HelloWorld{}表示指定哪张表
  • 查操作
  • db.First()来查数据库里的第一条数据
  • db.First()中加where来进行条件查找
  • db.Find()查找,方法中需要指定一个结构体切片
  • db.Where.Find()
  • 改操作
  • db.Update()修改单条数据的单个字段
  • db.Updates()修改单条数据的多个字段
  • db.Updates()将字段修改为0值的方法,比如false, 数字0, 空字符串
  • db.Updates()修改多条数据的方法
  • 删操作
  • db.Delete() 软删除
  • db.Where().Unscoped().Delete()硬删除