Gorm框架 教程

Gorm 是 Go 语言中实现对象和数据库映射的框架,可以有效地提高开发数据库应用的效率。

Gorm 主要用途是把 struct类型 和 数据库表 进行映射,使用简单方便。

因此,使用 Gorm 操作数据库的时候一般不需要直接手写 SQL 语句代码。

以下,主要介绍 Gorm 操作 MySQL 数据库。

1. Gorm 框架 官方地址

Gorm 框架 Github 地址: https://github.com/go-gorm/gorm

另外,Github 的 fork:https://github.com/jinzhu/gorm 使用也非常广泛。

2. Gorm框架 使用范例

1)安装依赖包

操作 MySQL 需要两个包:

  • MySQL 驱动包
  • Gorm 包

如果项目依赖包不使用 go mod 管理,那么就需要使用 go get 命令安装以上依赖包:

//安装 MySQL 驱动包
go get -u gorm.io/driver/mysql

//安装 Gorm 包
go get -u gorm.io/gorm 

2)导入依赖包

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

3)操作 Mysql 范例

使用 Gorm 库操作 Mysql 步骤:

  • 使用 struct 定义数据模型,数据模型是在 golang 中代表 Mysql 的一张表。
  • 使用 Gorm 创建数据库连接。
  • 使用 Gorm 操作数据库。

下面是范例中用到的数据库中 users 表的结构定义:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `username` varchar(30) NOT NULL COMMENT '账号',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `createtime` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
   PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

代码示例:

package main

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
  "fmt"
  "time"
  "errors"
)

// 定义 User 数据模型,绑定数据库中 users 表
// Gorm 操作数据库,需要定义一个 struct 类型和 Mysql 表进行绑定或者叫映射// struct 中的字段 和 Mysql 表的字段一一对应

// 在这里 User 类型可以代表 Mysql user表
type User struct {
    ID int64 // 主键
	// 通过在字段后面的标签说明,定义golang字段和表字段的关系
	// 例如 `gorm:"column:username"` 标签说明含义是: Mysql 表的列名为 username
	// 这里 golang 定义的 Username 变量和 Mysql 表字段 username 一样,他们的名字可以不一样。
	Username string `gorm:"column:username"`
	Password string `gorm:"column:password"`
	CreateTime int64 `gorm:"column:createtime"`
}

// 设置表名,可以通过给 struct 类型定义 TableName 函数,返回当前 struct 绑定的 Mysql 表名是什么
func (u User) TableName() string {
	// 绑定 Mysql 表名为 users
	return "users"
}

func main()  {
	// 配置 MySQL 连接参数
	username := "root"  //账号
	password := "123456" //密码
	host := "127.0.0.1" //数据库地址,可以是Ip或者域名
	port := 3306 //数据库端口
	Dbname := "aizws" //数据库名

	// 通过前面的数据库参数,拼接 Mysql DSN,其实就是数据库连接串(数据源名称)
	// Mysql dsn格式: {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local
	// 类似{username}使用花括号包着的名字都是需要替换的参数
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)

	// 连接 Mysql
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}

	// 定义一个用户,并初始化数据
	u := User{
		Username:"aizws",
		Password:"123456",
		CreateTime:time.Now().Unix(),
	}

	// 插入一条用户数据
	// 下面代码会自动生成SQL语句:INSERT INTO `users` (`username`,`password`,`createtime`) VALUES ('aizws','123456','1540824823')
	if err := db.Create(&u).Error; err != nil {
		fmt.Println("插入失败", err)
		return
	}

	// 查询并返回第一条数据
	// 定义需要保存数据的struct变量
	u = User{}
	// 自动生成sql: SELECT * FROM `users`  WHERE (username = 'aizws') LIMIT 1
	result := db.Where("username = ?", "aizws").First(&u)
	if errors.Is(result.Error, gorm.ErrRecordNotFound) {
		fmt.Println("找不到记录")
		return
	}
	// 打印查询到的数据
	fmt.Println(u.Username,u.Password)

	// 更新数据库记录
	// 自动生成Sql语句: UPDATE `users` SET `password` = '654321'  WHERE (username = 'aizws')
	db.Model(&User{}).Where("username = ?", "aizws").Update("password", "654321")

	// 删除数据库记录
	// 自动生成Sql: DELETE FROM `users`  WHERE (username = 'aizws')
	db.Where("username = ?", "aizws").Delete(&User{})
}

3. Gorm框架 错误处理

Gorm 在执行数据库操作的时候,如果出现错误,则会更新 gorm.DB 的 Error 属性,Error 属性默认为 nil,因此在执行数据库操作后检测下 Error 属性是否为 nil ,即可知道有没有错误发生。

// 插入记录后,检测 Error 是否为 nil
if err := db.Create(u).Error; err != nil {
	fmt.Println("插入失败", err)
	return
}

下一章:Gorm框架 模型定义

Gorm 框架操作数据库需要预先定义数据模型,数据模型的主要作用是充当操作数据库的媒介。在 Go 语言中 Gorm 模型定义是通过 struct 实现的,这样我们就可以通过 Gorm 库实现 struct 类型和 Mysql 表数据的映射。Gorm 模型的定义:Gorm 模型定义主要就是在 struct 类型定义的基础上增加字段标签说明实现。