库安装
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