使用GORM连接MySQL数据库并实现增删查改操作 | 青训营

59 阅读4分钟

ORM框架--GROM

简介

GORM是一个用于Go语言的数据模型ORM库,它基于SQL驱动,并提供了对象关系映射功能。

GORM具有以下特点:

  1. 自动数据库迁移:GORM支持自动生成数据库迁移文件,以实现数据库结构的自动更新。
  2. 快速查询:GORM支持使用Go的struct语法进行查询,简化了查询的开发过程。
  3. 灵活的查询构建:GORM支持使用表达式和函数构建复杂的查询条件。
  4. 事务处理:GORM支持事务处理,可以确保多个数据库操作的原子性。
  5. 性能优化:GORM针对Go的特性进行了优化,具有较高的性能。

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

连接数据库

// 数据源
var dsn ="user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

user : 数据库的用户名

pass : 数据库密码

@tcp(127.0.0.1:3306) : tcp连接ip为127.0.0.1(本地)的3306端口的数据库

dbname :连接的数据库名

charset=utf8mb4 : 设置编码格式

parseTime=True :想要正确的处理 time.Time,需要带上 parseTime 参数

loc=Local : 表示使用当地时间

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
  _ = db
}

表名 tbl_users

type TblUser struct {
	Id        int `gorm:"primaryKey"`
	Name      string
	Age       int
	CreatTime time.Time `gorm:"index"`
}

创建数据

// 创建数据 
user := TblUser{Name: "王一西", Age: 12, CreatTime: time.Now()}

result := db.Create(&user)

fmt.Println("新添加用户的ID ", user.Id) 			//新添加用户的ID  3
fmt.Println("返回的error ", result.Error)		  //返回的error  <nil>
fmt.Println("插入记录条数", result.RowsAffected)  //插入记录条数 1

批量插入

users := []TblUser{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)

删除数据

user := TblUser{Id: 8}

db.Delete(&user)                          // DELETE FROM tbl_users where id = 8;
db.Delete(&TblUser{}, "8")                // DELETE FROM tbl_users WHERE id = 8;
db.Delete(&TblUser{}, 8)                  // DELETE FROM tbl_users WHERE id = 8;
db.Delete(&TblUser{}, []int{1, 2, 3})     // DELETE FROM tbl_users WHERE id in (1,2,3);
db.Where("name = ?", "张三").Delete(&user) // DELETE FROM tbl_users where id = 10 AND name = "张三";

更新数据

// Save 会保存所有的字段,即使字段是零值
var user = TblUser{Id : 7,Name : "张三", CreatTime : time.Now()}
db.Save(&user)

// 单列 条件更新
db.Model(&TblUser{}).Where("Age = ?", 100).Update("Name", "hello1")
// UPDATE tbl_users SET name='hello' WHERE age=100;

// User 的 ID 是 `111`
db.Model(&user).Update("Name", "hello2")
// UPDATE tbl_users SET name='hello' WHERE id=7;

// 根据条件和 model 的值进行更新
db.Model(&user).Where("Age = ?", 100).Update("Name", "hello3")
// UPDATE tbl_users SET name='hello' WHERE id=7 AND active=true;

// 多列条件更新
// 根据 `struct` 更新属性,只会更新非零值的字段
db.Model(&user).Updates(TblUser{Name: "hello", Age: 18, CreatTime: time.Now()})

// 根据 `map` 更新属性
db.Model(&user).Updates(map[string]interface{}
                           {"Name": "hello5", "Age": 128, "CreatTime": time.Now()})

查询数据

简单查询

// 查询数据
user := TblUser{}
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM tbl_users ORDER BY id LIMIT 1;

// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM tbl_users LIMIT 1;

// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM tbl_users ORDER BY id DESC LIMIT 1;

result := db.First(&user)
fmt.Println(result.RowsAffected) // 返回找到的记录数
fmt.Println(result.Error)        // returns error

// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

主键查询

db.First(&user, 10)
// SELECT * FROM tbl_users WHERE id = 10;

db.First(&user, "10")
// SELECT * FROM tbl_users WHERE id = 10;

var users []TblUser
db.Find(&users, []int{1, 2, 3})
// SELECT * FROM tbl_users WHERE id IN (1,2,3);

条件查询

// 获取第一条匹配的记录
db.Where("name = ?", "赵四").First(&user)
// SELECT * FROM tbl_users WHERE name = '赵四' ORDER BY id LIMIT 1;
	
// 获取全部匹配的记录
db.Where("name <> ?", "赵四").Find(&users)
// SELECT * FROM tbl_users WHERE name <> '赵四';

// IN
db.Where("name IN ?", []string{"张三1", "张三2"}).Find(&users)
// SELECT * FROM tbl_users WHERE name IN ('张三1','张三2');

// LIKE
db.Where("name LIKE ?", "%张%").Find(&users)
// SELECT * FROM tbl_users WHERE name LIKE '%张%';

// AND
db.Where("name = ? AND age >= ?", "李四", "22").Find(&users)
// SELECT * FROM tbl_users WHERE name = '李四' AND age >= 22;

// Time
lastWeek := "2000-01-01 00:00:00"
db.Where("created_time > ?", lastWeek).Find(&users)
// SELECT * FROM tbl_users WHERE created_time > '2000-01-01 00:00:00';

// BETWEEN
today := "2000-01-08 00:00:00"
db.Where("created_time BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM tbl_users WHERE created_time BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';

总结:通过GROM框架,结构体能够自动和数据库表进行映射,能够自动进行驼峰映射。对于简单的SQL语句,GROM提供了很多CRUD接口,能够通过简单的设置创建数据库连接池。

sqlDB, err := db.DB()

// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)

// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)

// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)

能够在不写SQL语句的同时还可以防止数据注入等问题。