Go 语言ORM框架

2021年02月27日 307次浏览 Golang

知识点

  • 如何配置数据库链接
  • 如何使用 GORM 定义数据模型
  • 使用 GORM 完成增删改查

预备知识

  • 如何定义结构体
  • 结构体字段的 tag 使用

gorm是一款强大且优秀的 Go 语言 orm 框架。主要功能如下:

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

添加依赖

go get -u github.com/jinzhu/gorm

模型定义

type User struct {
    Id    int64  `gorm:"PRIMARY_KEY;AUTO_INCREMENT"` // 编号,主键、自增长
    Name  string `gorm:"size:32;not null"`           // 用户名,长度32,不可空
    Email string `gorm:"size:128;not null"`          // 邮箱,长度128,不可空
}

模型的每个字段都可以添加标记(Tag),通过 Tag 可以配置字段的属性,gorm 支持以下标记:
| 标记(Tag) | 描述 |
| ----------------------------- | ----------------------------- |
| Column | 指定列名 |
| Type | 指定列数据类型 |
| Size | 指定列大小, 默认值 255 |
| PRIMARY_KEY | 将列指定为主键 |
| UNIQUE | 将列指定为唯一 |
| DEFAULT | 指定列默认值 |
| PRECISION | 指定列精度 |
| NOT NULL | 将列指定为非 NULL |
| AUTO_INCREMENT | 指定列是否为自增类型 |
| INDEX | 创建具有或不带名称的索引, 如果多个索引同名则创建复合索引 |
| UNIQUE_INDEX | 和 INDEX 类似,只不过创建的是唯一索引 |
| EMBEDDED | 将结构设置为嵌入 |
| EMBEDDED_PREFIX | 设置嵌入结构的前缀 |
| - | 忽略此字段 |

连接数据库

gorm 支持 sqlite,mysql,postgreSql,mssql,所以在连接数据库的时候需要指定你的数据库类型,下面我们以mysql为例进行讲解。

首先我们连上 mysql 创建数据库:test_db,创建数据库命令如下:

注意:实验楼环境默认情况下 mysql 服务是未启动的,启动 mysql 服务命令为:sudo service mysql start,实验楼 mysql 默认是没有密码的。

CREATE DATABASE `test_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

接下来编写 Go 代码,使用gorm连接数据库:

package main

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

func main() {
    // 连接数据库
    db, err := gorm.Open("mysql", "root@tcp(localhost:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()
}

首先我们需要将 gorm 和 mysql 支持引入进来,即:

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

那么链接数据库就变得很简单了, 只需要调用 gorm.Open 方法即可,该方法有两个参数,第一个参数是指定数据库类型,第二个参数是数据库的链接。这里我们将数据库类型设定为 mysql,mysql 的链接格式为:

username:password@tcp(数据库地址:端口)/数据库名称

gorm.Open有两个返回值,第一个返回值就是数据库链接,第二个返回值是错误信息,当错误信息为空时表示数据库连接成功,连接成功之后我们即可正常操作数据库啦。

另外,gorm 还提供了AutoMigrate功能,他会根据我们结构体中的定义来自动为我们创建表,开启只需要调用AutoMigrate方法,并且将我们的结构体传入进去即可,代码如下:

// 自动根据结构体创建
db.AutoMigrate(&User{})

连接好数据库后,我们来试试基础的增删改查功能

插入

db.Create(&User{
    Name:  "小明",
    Email: "xiaoming@gmail.com",
})

###更新数据

var user User
db.Where("name = ?", "小明").First(&user)
fmt.Println("小明的邮箱为:" + user.Email)

// 重新赋值,然后更新
user.Email = "xiaoming2@gmail.com"
db.Save(user)

查询数据

查询单条数据:

var user User
db.Where("name = ?", "小明").First(&user)
fmt.Println("小明的邮箱为:" + user.Email)

查询列表数据:

var users []User
db.Find(&users)
fmt.Println("总用户数:", len(users))

删除数据

db.Where("name = ?", "小明").Delete(&User{})

gorm 的功能非常强大,我们这里所讲的只是gorm最基本的使用方法,如果想深入地了解gorm可以去他的官网查看更详细的文档,gorm官网:http://gorm.io