Go中的gorm

344 阅读3分钟

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战

gorm简介

gorm是Go中一个操作关系数据库的ORM库, 弱化我们sql语言, 提供给我们更方便快捷的方法特性

orm全称object relation mapping对象映射关系, 是为了解决面向对象和关系数据库之间的匹配的技术.

orm让我们不再关注操作数据库的细节, 而让我们更好的将精力放到业务逻辑上.

gorm特性

  1. 支持context
  2. 支持批量插入数据
  3. 支持指更新数据
  4. 支持批量删除数据
  5. 支持sql的预编译
  6. 支持DryRun 模式
  7. 支持从结构体或者map创建表
  8. 支持分组查询
  9. 支持子查询
  10. 支持定义字段权限, 定义字段属性
  11. 支持事务模式

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