gorm框架操作数据库 | 青训营

115 阅读4分钟

1、完成数据库的连接

在项目文件中首先创建一个初始化数据库的文件夹,为了方便这里设置为initDB在这里创建一个initDB.go文件,里面放着数据库的初始化的函数。 由于go语言的包管理机制,函数、变量、接口、结构体的首字母必须大写才能被其他的包访问,这里我首先创建一个*gorm.DB的操作数据库的对象变量var Db *gorm.DB
之后使用变量来记录需要连接数据的各个参数,使用gorm.Open()函数完成数据库的连接,gorm.Open函数的函数签名是:func Open(dialector Dialector, opts ...Option) (db *DB, err error)返回一个数据库连接的指针变量和一个错误处理。

if err!=nil {
    //在日志中打印数据库连接失败的原因
    log.Println("数据库连接失败,error="+err.Error())
}
package initDB

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

var Db *gorm.DB

func InitDb() {
    var err error
    username := "root"
    password := "1234"
    //IP地址
    host := "127.0.0.1"
    //端口
    port := 3306
    //连接带的数据库
    Dbname := "ginhello"
    //设置超时的时间。
    timeout := "10s"
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
    Db, err = gorm.Open(mysql.Open(dsn))
    if err != nil {
       log.Println("数据库连接失败,error=", err.Error())
    }
}

2、初始化表结构

创建student student2两个结构体,声明结构体时添加上json 和 gorm标签,json 标签在序列化和反序列化 JSON 数据时非常有用。它使得结构体字段能够更好地与 JSON 数据进行交互,从而实现准确的字段映射和控制。需要注意的是,json 标签仅在使用 encoding/json 包进行 JSON 序列化和反序列化时有效,其他包可能不会使用这些标签。
json 标签指定了字段在 JSON 中的名称,使得JSON 字符串中的字段为first_name 和 last_name,而不是结构体字段的实际名称。

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	FirstName string `json:"first_name"`
	LastName  string `json:"last_name"`
}

func main() {
	p := Person{
		FirstName: "John",
		LastName:  "sanye",
	}
	jsonData, _ := json.Marshal(p)
	fmt.Println(string(jsonData))
}

同理gorm创建数据库表的时候 根据gorm标签信息在创建数据库的时候完成数据库表的字段属性,例如:

type Student struct {
    Id    uint    `json:"id" gorm:"size:10;primaryKey"`
    Name  string  `json:"name" gorm:"size:16"`
    Age   int     `json:"age" gorm:"size:3"`
    Email *string `json:"email" gorm:"size:128"`
    Date  string  `gorm:"size:30;default:2022-8-20;comment:日期"`
}

设置Id字段为主键,占用的字节大小为10...以及设置Date为default字段设置默认的日期comment设置数据库表的备注信息。 创建出来结构体对象后gorm框架可以使用AutoMigrate()方法创建一个数据库表。

// 如果Email 是*string的类型的话就是为了存空值
type Student struct {
    Id    uint    `json:"id" gorm:"size:10"`
    Name  string  `json:"name" gorm:"size:16"`
    Age   int     `json:"age" gorm:"size:3"`
    Email *string `json:"email" gorm:"size:128"`
    Date  string  `gorm:"size:30;default:2022-8-20;comment:日期"`
}

func Create_Student() {
    err := initDB.Db.Debug().AutoMigrate(&Student{})
    if err != nil {
       log.Println("error is" + err.Error())
    }
}

// 使用json标签后 json序列化后 使用string()就可以使用json的名称
type Student2 struct {
    ID     uint   `gorm:"size:3" json:"id"`
    Name   string `gorm:"size:8" json:"name"`
    Age    int    `gorm:"size:3" json:"age"`
    Gender bool
    Email  *string `gorm:"size:128" json:"email"`
}

func Create_Student2() {
    err := initDB.Db.Debug().AutoMigrate(&Student2{})
    if err != nil {
       log.Println("error is" + err.Error())
    }
}

数据库表插入数据

由于设置Email字段为指针类型(Email 设置为指针类型后可以方便传空值)首先定义一个email变量设置它的值 email:="sanye@acoier.com",使用create()函数插入字段。

s1 := model.Student2{
    Name:   "sanye",
    Age:    21,
    Gender: true,
    Email:  &email,
}
err := initDB.Db.Debug().Create(&s1).Error
if err != nil {
    log.Println("error is" + err.Error())
}
fmt.Printf("%+v\n", s1)

由于Db 这个变量在initDB这个包下面 initDB.Db调用这个包的变量Debug()函数显示数据库创建的信息,create()方法里面传入一个结构体的指针类型。


除了单个的插入数据还可以使用一个切片 批量的插入数据。 var StudentList []model.Student2

//批量的插入
var StudentList []model.Student2
for i := 0; i < 10; i++ {
    StudentList = append(StudentList, model.Student2{
       Name:   fmt.Sprintf("sanye%d", i+1),
       Age:    18 + i + 1,
       Gender: false,
       Email:  &email,
    })
}
err := initDB.Db.Debug().Create(&StudentList).Error
if err != nil {
    log.Println("error is", err.Error())
}

数据库表结构的基础查询

首先定义一个数据库结构体的切片 var s1 []model.Student2,使用Find()函数查询结果

err := initDB.Db.Debug().Find(&s1, "name=?", "sanye9").Error
if err!=nil {
    log.Println("error is"+err.Error())
}
return s1

s1就是查询后输出的结果。

表结构的更新

使用Updates完成字段的更新,首先定义一个结构体var StudentList []model.Student2

//使用结构体的方法来做
initDB.Db.Debug().Find(&StudentList, "age=?", 27).Updates(model.Student2{
  Age:  18,
  Name: "sanye最好了",
})

Find()函数查找所有的符合条件的字段进行修改。

表结构的删除

var student []model.Student2 创建student切片,使用Delete方法根据字段查询数据进行删除。

err := initDB.Db.Debug().Delete(&student, "age=? and name=?", 24, "sanye7").Error
if err != nil {
    log.Println("error is " + err.Error())
}