使用 GORM(Go 的 ORM 库)连接数据库,实现增删改查 | 青训营

93 阅读2分钟

What is GORM?

GORM是一个go语言开发的ORM框架,ORM全称是Object-Relationship-Mapping,像Java中经常用到的MyBatis就是一个ORM框架,而GORM也是一样,大大降低了对开发人员的sql语句能力,开发人员只需要调用框架中的api即可,剩下的由GORM框架将代码转换成SQL语句后,对数据库进行操作。

其优点是大大简化了程序员工作,提高了开发效率,缺点是在性能优化方面有些许不足。

How to use

需要下载依赖,命令如下

go get -u github.com/jinzhu/gorm
go get github.com/jinzhu/gorm/dialects/mysql@v1.9.16

看到以下信息说明依赖下载成功

image.png 由于我不想搞乱我电脑上原有的环境,所以在hyper-v的centos里装了一个docker版的mysql(不知道编译安装为什么编译失败)

image.png 命令的意思是运行docker的镜像mysql8019 映射容器的3306端口到宿主机的13306端口,mysql的用户名是root密码是1234,运行docker ps出现下图所示,即安装成功 image.png

连接到MySQL

package main

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

func main() {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	//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{})
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       "root:1234@tcp(11.8.1.8:13306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
		DefaultStringSize:         256,                                                                                // string 类型字段的默认长度
		DisableDatetimePrecision:  true,                                                                               // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,                                                                               // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,                                                                               // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,                                                                              // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
	// ----------------------------数据库连接池----------------------------
	sqlDB, err := db.DB()
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Hour)
	fmt.Println("success to link mysql")
	select {}
}

定义数据库表结构对应的数据结构

表结构

CREATE TABLE `test` (
  `id` bigint(20) NOT NULL,
  `name` varchar(5) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

对应struct代码

type Test struct {
	ID   int64  `gorm:"type:bigint(20);column:id;primary_key"`
	Name string `gorm:"type:varchar(5);column:name"`
	Age  int    `gorm:"type:int(11);column:age"`
}

CRUD

C

test := &Test{
		ID:3,
		Name:"jackie",
		Age:18,
	}
	db.Create(test)

D

test := &Test{
		ID:3,
		Name:"jackie",
		Age:18,
	}
db.Delete(test)

U

test := &Test{
		ID:   3,
		Name: "hello",
		Age:  18,
	}
db.Model(&test).Update("name", "world")

R

var testResult Test
db.Where("name = ?", "hello").First(&testResult)
fmt.Println("result: ", testResult)