这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战
gorm简介
gorm是Go中一个操作关系数据库的ORM库, 弱化我们sql语言, 提供给我们更方便快捷的方法特性
orm全称object relation mapping对象映射关系, 是为了解决面向对象和关系数据库之间的匹配的技术.
orm让我们不再关注操作数据库的细节, 而让我们更好的将精力放到业务逻辑上.
gorm特性
- 支持context
- 支持批量插入数据
- 支持指更新数据
- 支持批量删除数据
- 支持sql的预编译
- 支持DryRun 模式
- 支持从结构体或者map创建表
- 支持分组查询
- 支持子查询
- 支持定义字段权限, 定义字段属性
- 支持事务模式
安装gorm
go get -u github.com/jinzhu/gorm
导入包
需要导入gorm包和数据库驱动包, 其中数据库驱动包为匿名导入
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
连接MySQL
// 打开数据库
ddbb, err := gorm.Open("mysql", "root:fengqing2018@(127.0.0.1:3306)/LCLDataBase?charset=utf8")
db = ddbb
if err != nil {
log.Fatal("mysql open failed:", err)
}
// 数据库打开成功
fmt.Println("mysql open success!")
// 不用之后关闭数据库
defer func() {
fmt.Println("mysql closed!")
defer db.Close()
}()
创建表
表名的为结构体名全小写的复数形式, 如Student对应的表名为students, User对应的表名为users
如果表不存在, 则创建表
CREATE TABLE `students` (`id` int unsigned AUTO_INCREMENT,`name` varchar(255),`age` tinyint unsigned , PRIMARY KEY (`id`))
// 结构体与数据库中的表进行自动关联
db.Debug().AutoMigrate(&Student{})
添加数据
Create方法向表中添加一条数据
实际执行sql语句为: // 向表中添加一条数据 INSERT INTO students (name,age) VALUES ('shaosiming',18) INSERT INTO students (name,age) VALUES ('dasiming',20)
stu := &Student{
Name: "shaosiming",
Age: 18,
}
stu2 := &Student{
Name: "dasiming",
Age: 20,
}
// 向表中添加数据
db.Debug().Create(stu)
db.Debug().Create(stu2)
查询数据
First方法查询第一条数据
对应sql语句为
SELECT * FROM students ORDER BY students.id ASC LIMIT 1
// 创建一个空结构体
var stu Student
// 查询第一条数据
// SELECT * FROM `students` ORDER BY `students`.`id` ASC LIMIT 1
db.Debug().First(&stu)
// 查看查询出来的数据
fmt.Println("first: ", stu)
db.Where("name = ?", "dasiming").First(&stu)
查询最后一条数据
Last方法查询最后一条数据
对应sql语句为
SELECT * FROM students ORDER BY students.id DESC LIMIT 1
db.Debug().Last(&stu)
fmt.Println("last: ", stu)
查询所有数据
当查询所有数据时, 我们只需要传入一个空结构体变量即可
对应sql语句为
SELECT * FROM students
var stus []Student
db.Debug().Find(&stus)
fmt.Println("find all:", stus)
查询指定字段值的数据
var stu Student
db.Debug().Find(&stu, "name = ?", "shaosiming")
fmt.Println("find condition:", stu)
// 当查询所有记录时, 返回的数据, 我们需要一个切片类型接收数据
var stus []Student
db.Debug().Find(&stus, "name = ?", "shaosiming")
fmt.Println("find condition:", stus)
更新数据
更新一条数据
对应sql语句为
UPDATE students SET name = '少司命', age = 18 WHERE students.id = 1
当使用Save方法更新数据时, 默认更新所有的字段的值
// SELECT * FROM `students` ORDER BY `students`.`id` ASC LIMIT 1
var stu Student
db.Debug().First(&stu)
fmt.Println("first data:", stu)
// 修改所有字段值
stu.Name = "少司命"
db.Debug().Save(&stu)
更新指定字段值
默认sql语句为
UPDATE students SET name = 'shaosiming' WHERE students.id = 1
var stu Student
db.Debug().First(&stu)
fmt.Println("first data:", stu)
// 更新指定单个字段
db.Debug().Model(&stu).Update("name", "shaosiming")
更新多个指定字段值
我们可以通过一个map来指定多对字段和值进行更新
对应sql语句为
UPDATE students SET age = 16, name = 'shaosiming' WHERE students.id = 1
var stu Student
db.Debug().First(&stu)
fmt.Println("first data:", stu)
// 更新指定多个字段
m := map[string]interface{}{
"name": "shaosiming",
"age": 16,
}
db.Debug().Model(&stu).Update(m)
批量更新
对应sql语句为
UPDATE `students` SET `age` = 12 WHERE (name = 'shaosiming')
m := map[string]interface{}{
"age": 12,
}
db.Debug().Table("students").Where("name = ?", "shaosiming").Update(m)
删除数据
单条删除
对应sql语句为
DELETE FROM students WHERE students.id = 1
var stu Student
db.Debug().First(&stu)
fmt.Println("first data:", stu)
// 删除当前数据
db.Debug().Delete(&stu)
批量删除
对应sql语句为
DELETE FROM students WHERE (age = 18)
// 使用where指定字段值批量删除
db.Debug().Where("age = ?", 18).Delete(Student{})
// 使用Delete指定字段值批量删除
db.Debug().Delete(Student{}, "age = ?", 18)