GO语言学习之GORM框架详解|青训营

207 阅读4分钟

GO语言学习之GORM框架详解

前言

继前两篇文章讲解了部分GO语言基本操作之后,本文将带大家继续学习了解GO语言非常重要实用的一种框架——GORM

下列是从官方文档中截取的部分有关GORM框架的信息

GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL,PostgreSQL,SQLite,SQL Server,Clickhouse。此框架的特点,弱化了开发者对于 SQL 语言的掌握程度,使用提供的 API 进行底层数据库的访问。

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server。

作者是中国人,中文文档齐全,对开发者友好,支持主流数据库。

其特点如下:

全功能ORM

关联(包含一个,包含多个,属于,多对多,多种包含)

Callbacks(创建/保存/更新/删除/查找之前/之后)

预加载;

事务

复合主键

SQL Builder

自动迁移

日志

可扩展,编写基于GORM回调的插件

每个功能都有测试

开发人员友好

但GORM也并非全是优点,它牺牲了执行能力和灵活性,弱化了SQL能力,使得部分数据库操作变得更加繁琐

安装与连接

根据官方文档的内容,可以直接在goland或者vscode的终端执行以下命令进行安装

go get github.com/jinzhu/gorm

数据库连接

数据库连接有以下两种方式,一种简单,一种复杂,可以根据个人喜好进行选择

先需要在mysql中输入如下sql语句创建一个数据库:

create database gorm;

创建好后再输入下列sql语句进入该数据库:

use gorm;

随后在vscode或者goland中按照如下模板写入代码并执行

package main

import (

"fmt"

"gorm.io/driver/mysql"

"gorm.io/gorm"

"time"

)

func main() {

// 参考 github.com/go-sql-driv… 获取详情

//dsn := "root:password@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:password@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local",

}), &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 {}

}

image.png 注意:想要正确的处理 time.Time ,应使用parseTime 参数,(更多参数)要支持完整的 UTF-8 编码,您需要将 charset=utf8 更改为charset=utf8mb4

若未报错,则说明连接成功

表数据操作:增删改查

添加数据

在vscode或者goland中按照如下模板写入代码并执行

package main

import (

"fmt"

"gorm.io/driver/mysql"

"gorm.io/gorm"

)

type User struct {

Id int

Name string

Age int

}

func main() {

dsn := "root:root123@tcp(127.0.0.1:3306)/gorm? charset=utf8mb4&parseTime=True&loc=Local"

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

if err != nil {

panic(err)

}

db.AutoMigrate(&User{})

db.Create(&User{ Name: "张三", Age: 18, })

}

image.png

随后在mysql中输入下列语句查看数据表是否创建成功:

show tables;

若显示表名则说明操作成功,数据库已经连接,随后输入下列语句查看表中内容:

select *from users;

若成功显示则说明操作成功

查找数据

在vscode或者goland中按照如下模板写入代码并执行

package main

import (

"fmt"

"gorm.io/driver/mysql"

"gorm.io/gorm"

)

type User struct {

Id int

Name string

Age int

}

func main() {

dsn := "root:root123@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"

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

if err != nil {

panic(err)

}

db.AutoMigrate(&User{})

var user User

db.First(&user)

fmt.Println(user)

}

image.png

若在终端中成功输出之前添加的信息,则说明查找成功

更新数据

在vscode或者goland中按照如下模板写入代码并执行

package main

import (

"fmt"

"gorm.io/driver/mysql"

"gorm.io/gorm"

)

type User struct {

Id int

Name string

Age int

}

func main() {

dsn := "root:root123@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"

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

if err != nil {

panic(err)

}

db.AutoMigrate(&User{})

user.Name = "lisi"

db.Save(&user)

fmt.Println(user)

}

image.png 若成功输出更改后的信息,则说明操作成功,此时我们再前往mysql中进行进一步确认:

select *from users; 若mysql中也输出正确的数据则说明操作成功

删除数据

在vscode或者goland中按照如下模板写入代码并执行

package main

import (

"fmt"

"gorm.io/driver/mysql"

"gorm.io/gorm"

)

type User struct {

Id int

Name string

Age int

}

func main() {

dsn := "root:root123@tcp(127.0.0.1:3306)/test_gorm?charset=utf8mb4&parseTime=True&loc=Local"

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

if err != nil {

panic(err)

}

db.AutoMigrate(&User{})

db.Delete(&user)

}

image.png 此时我们再前往mysql中进行确认:

select *from users; 若mysql中也输出正确的数据则说明操作成功

gorm.Model

基本模型定义gorm.Model,包括字段 ID,CreatedAt,UpdatedAt,DeletedAt 参数说明: ID:主键自增长; CreatedAt:用于存储记录的创建时间; UpdatedAt:用于存储记录的修改时间; DeletedAt:用于存储记录的删除时间;

高级

结构体标签gorm的使用:

type User struct { Name string gorm:"<-:create" // 允许读和创建 Name string gorm:"<-:update" // 允许读和更新 Name string gorm:"<-" // 允许读和写(创建和更新) Name string gorm:"<-:false" // 允许读,禁止写 Name string gorm:"->" // 只读(除非有自定义配置,否则禁止写) Name string gorm:"->;<-:create" // 允许读和写 Name string gorm:"->:false;<-:create" // 仅创建(禁止从 db 读) Name string gorm:"-" // 读写操作均会忽略该字段 }

总结

本文主要介绍了 GORM 框架的相关基础知识,但具体的细节还是需要仔细研究官方文档。