Go语言之GORM的使用入门

库安装

go get -u github.com/jinzhu/gorm
复制代码

数据库连接

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"  //mysql驱动
)

    db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local") //Open函数指定连接的数据库类型和数据库
    if err!= nil{
        panic(err)
    }
    defer db.Close()
复制代码

上面是mysql的连接方式,若连接sqlite3和postgresql换成对应的数据库驱动和改变Open函数传参即可,如连接sqlite3写法如下:

import (
  "github.com/jinzhu/gorm"
  _ "github.com/jinzhu/gorm/dialects/sqlite"
)

db, err := gorm.Open("sqlite3", "test.db")
  if err != nil {
    panic("failed to connect database")
  }
  defer db.Close()
复制代码

GORM通过结构体映射的方式创建表结构,表名为结构体的小写形式的复数,若是驼峰命名法的结构体,中间的大写字母之间会转化多一个_,例如:

type UserInfo struct {
  gorm.Model   // 会自动包含一些基本字段的结构体,包含的字段有 ID,CreatedAt, UpdatedAt,     DeletedAt
	Name string
	Age int
	sex bool
}

func main() {
	    db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local") //Open函数指定连接的数据库类型和数据库
    if err!= nil{
        panic(err)
    }

	// 自动迁移创建表结构
	db.AutoMigrate(&UserInfo{})
}  
复制代码

数据库test库中会自动创建一个user_infos的表,gorm目前对新加的字段会自动迁移到表结果中,但不支持删除字段。若需指定创建的表的名字,重写TableName方法即可。

func (u UserInfo) TableName() string {
	return "tb_user_profile"  //指定表名
}
复制代码

下面是常见的增删改查基本使用例子。

	db.Create(&UserInfo{Name: "王五",Age: 20,sex: true})  //新增
	db.Create(&UserInfo{Name: "李翠花",Age: 21,sex: false})

	var userinfo UserInfo
	db.Find(&userinfo,"name = ?","王五") //查询
	fmt.Println(userinfo)
	// 更新
	db.Model(&userinfo).Update("Age", 28)
	fmt.Println(userinfo)
	//删除
	db.Delete(&userinfo)  // 逻辑删除,将delete_at置空
	fmt.Println(userinfo)
复制代码

结合gin的一个综合例子:

package main

import (

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"github.com/gin-gonic/gin"
)

type Class struct {
	gorm.Model
	Students []Student  //班级有多个学生
	ClassName string
}
type Student struct {
	gorm.Model
	ClassID uint
	IDCard IDCard
	// 多对多
	Teachers []Teacher `gorm:"many2many:student_teachers;"`
	TeacherID uint
	StudentName string
}

type IDCard struct {
	StudentID uint
	Num int
}

type Teacher struct {
	gorm.Model
	TeacherName string
	StudentID uint
	Students []Student `gorm:"many2many:student_teachers;"`
}


func main()  {

	db,err := gorm.Open("mysql" ,"root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil{
		panic(err)
	}
	db.AutoMigrate(&User{},&Teacher{},&Class{},&Student{},&IDCard{})
	defer db.Close()

	r := gin.Default()
	r.POST("/student", func(c *gin.Context) {
		var student Student
		_ = c.BindJSON(&student)
		db.Create(&student)

		c.JSON(200,gin.H{
			"s":student,
		})
	})

	r.GET("/student/:ID", func(c *gin.Context) {
		id := c.Param("ID")
		var student Student
		_ = c.BindJSON(&student)
		//db.First(&student,"id=?",id)
		db.Preload("Teachers").Preload("IDCard").First(&student,"id=?",id) 
		c.JSON(200,gin.H{
			"s":student,
		})
	})

	r.GET("/class/:ID", func(c *gin.Context) {
		id := c.Param("ID")
		var class Class
		db.Preload("Students").Preload("Students.IDCard").Preload("Students.Teachers").First(&class,"id=?",id)
		c.JSON(200,gin.H{
			"c":class,
		})
	})

	r.Run(":8888")
}
复制代码

GORM结合gin完成了student信息新增和单个学生查询和查询特定班级的小案例,Preload预加载可以将关联的表信息一起返回出来。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享