gorm中文官方文档 https://jasperxu.com/Programming/Golang/GORM/
另外一个文档 https://learnku.com/docs/gorm/v2/index/9728
什么是orm
- 一种数据库操作辅助工具
- 在我们go的结构体和数据库之间产生映射,让我们对数据库的关系,表的内容,直观的体现在结构体上
- 使用结构体即可完成增删改查操作
如何连接数据库
- 引入gorm包 github.com/jinzhu/gorm
- 引入mysql驱动包 github.com/go-sql-driver/mysql
- 首次建立一个数据库连接,代码如下
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结构体,建表时会自动创建这些字段。
建表后结构如下
建完表后来进行一些基本的增删改查操作。
增操作
用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,
})
}
运行后可以看到在表中多了一条数据。
我们再随便创建两条数据来查下。
查操作
- db.First方法使用
我们用db.First来查数据库里的第一条数据
运行后结果如下
指定条件进行查询
查询结果如下 - db.Find方法使用
注意:db.Find的时候要接受的是一个切片的地址
代码如下
打印结果如下
可以看到不加条件的话db.Find把所有结果都查出来了。
我们加上where sex = false条件来查询下
代码如下
结果如下
一般在实际开发过程中会把where写在前面,示例如下
or语句比较简单可以在where里面写或者db.where().Or.Find()
改操作
db.Update()修改单个字段
将helloworld表中id为1的数据中的name字段的值改成Jack
代码如下
db.Updates()来修改多个字段
Updates(HelloWorld{})里面如果是一个空属性,比如age=0,或者Name=“”, 或者sex=false,则这些字段不会被修改。如果想要修改把字段改成这些空属性,比如将Age改成0,则要加一个map
代码如下
如果要修改多条数据,比如id in 1,2的都改下
代码如下
注意First方法里要加切片
删操作
用db.Delete方法
但是这个删除是软删除,见下图
删除id为1和2的数据,代码如下
这个也是软删除,如果想进行硬删除要加上Unscoped()方法
代码如下
总结
- 创建连接
- 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()硬删除