使用 GORM(Go 的 ORM 库)连接数据库 | 青训营

101 阅读3分钟

使用GORM连接数据库

1GORM简介

Gorm是Go语言中一款性能极好的ORM库,对开发人员相对比较友好,能够显著提升开发效率。

功能特点:

  • 支持数据库自动迁移;
  • 支持自定义日志;
  • 可扩展性,可基于Gorm回调编写插件;
  • 所有功能都被测试覆盖。
  • 是一个全功能ORM(无限接近);
  • 支持复合主键;
  • 支持SQL生成器;
  • 支持关联(Has One、Has Many、Belongs To、Many To Many、多态);
  • 支持钩子函数Hook(在创建/保存/更新/删除/查找之前或之后);
  • 支持预加载:
  • 支持事务;

2安装

## 必须安装gorm
go get -u gorm.io/gorm     
## 安装相应的数据库驱动。GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
go get -u gorm.io/driver/mysql  

此时导包

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

安装

go get -u github.com/jinzhu/gorm
go get -u github.com/go-sql-driver/mysql  

此时导包

import (
    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
)

3使用过程

3.1建表

使用mysql中语句建立一个表user,有id、姓名、密码

create table `users`(
    `id` int(10) unsigned not null auto_increment,
    `name` varchar(255) default null,
    `password` varchar(255) default null,
    primary key(`id`)
)engine=InnoDB auto_increment=1 default charset=utf8;

3.2定义操作数据库的模型

声明模型 模型是带有基本Go类型的普通结构,指针/别名,或者实现了Scanner和Valuer接口的自定义类型

这里使用了encoding/json包

//数据表的结构体类
type User struct {
    ID uint `json:"id"`
    Name string `json:"name"`
    PassWord string `json:"password"`
}

其中使用约定是方便的,配置比较麻烦

GORM 更喜欢约定而不是配置,默认情况下,GORM 使用ID作为主键,将结构名称复数users作为表名,name作为列名

3.3建立数据库连接工具类

package repository

import (
    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
    "log"
)

func main() {
    db, err := gorm.Open("mysql", "root:root@(127.0.0.1:3306)/mytable?"+"charset=utf8mb4&parseTime=True")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    db.DB().SetMaxIdleConns(10)//设置空闲连接池中的最大连接数
    db.DB().SetMaxOpenConns(100)//设置与数据库的最大打开连接数
    
    /*
    操作
    */
}

3.4插入数据

Gorm中db.Save()和db.Create()方法均可插入数据。根据构造好的结构体对象,直接调用db.Save()方法就可以插入一条记录。

//创建用户,插入数据
User := model.User{
    Name:     "linxi",
    Password: "123456",
}
//保存到数据库
db.Save(&User)
//db.Create(&User) 用于插入数据

3.5查询数据

Gorm中查询数据,先用db.Where()方法构造查询条件,再用db.Count()方法计算数量。如果要查询多条记录,则可以用db.Find(&GormUser)语句来实现。如果只需要查询一条记录,则可以用db.First(&User)语句来实现

//查询数据
var user = new(model.User)
db.Where("phone = ?", "18812345678").Find(&user1)
//db.First(&user1, "name = ?", "linxi")
fmt.Println(*user)//{1 linxi 123456}

3.6更新数据

Gorm中更新数据使用Update()方法

//更新数据
var user = new(model.User)
count := db.Model(&user).Where("name = ?", "linxi").Update("passward", "111111").RowsAffected
fmt.Println(count)//1

3.7删除数据

在Gorm中删除数据,一般先用db.Vhere()方法构造查询条件,再调用db.Delete()方法进行删除

//删除用户
var user = new(model.User)
count := db.Where("name = ?", "linxi").Delete(&user).RowsAffected
fmt.Println(count)//1

3.8事务处理

Gorm中事务的处理也很简单:用db.Begin()方法声明开启事务,用tx.Commit()方法结束事务,在异常时调用tⅸ.Rollback()方法回滚

//开启事务
tx := db.Begin()

user := model.User{
    Name:     "xxx",
    Password: "123456",
}
if err := tx.Create(&user).Error; err != nil {
    //事务回滚
    tx.Rollback()
    fmt.Println(err)
}
db.First(&user, "name = ?", "linxi")
fmt.Println(user)
//事务提交
tx.Commit()