Go组件:go中grom学习

1、gorm是什么

  gorm就是基于Go语言实现的ORM库。类似于Java生态里大家听到过的Mybatis、Hibernate、SpringData等。然后重要的一点,是国人自己写的。

  而ORM的概念是:Object-Relationl Mapping, 它的作用是映射数据库和对象之间的关系,方便我们在实现数据库操作的时候不用去写复杂的sql语句,把对数据库的操作上升到对于对象的操作。

2、gorm怎么理解

  gorm做了一个数据库 <-> 对象的关系映射

  让操作sql,变成了操作对象

3、gorm能干什么

  1.针对表中的数据:增删改查

  2.针对库中的表:增删改查?

4、gorm怎么用

4.1 下载gorm

go get -u github.com/jinzhu/gorm

4.2 引入gorm

手动引入

import (
   //引入gorm
  "github.com/jinzhu/gorm"
//引入gorm中的mysql,用于进行连接 _ "github.com/jinzhu/gorm/dialects/mysql" )

mod引入

写好代码,在文件下执行go build,go.mod会自动添加对于gorm的依赖包

4.3 建立连接

package main
 
import (
  "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)
 
func main() {
    var err error
    db, err := gorm.Open("mysql", "root:rootroottcp(192.168.1.127:3307)/yang?charset=utf8&parseTime=True&loc=Local")

  //下面这项配置是用于取消‘s’的,gorm本身在创建表时会自带‘s’,需要手动添加该项进行取消
  db.SingularTable(true)

    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()


}

4.4 创建与表对应的结构体

必须要注意的是结构体的名字必须对应表的名字,并采用驼峰命名法取代下划线,否则无法建立对应关系,进而无法进行相关数据操作

 目标表结构

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

创建对应结构体如下

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"`
}

4.5 实现CRUD

4.5.1 对于表本身的操作

增:(gorm的‘自动迁移’)

// 引用定义的结构体直接实现‘自动迁移’,这种迁移的实现不是覆盖式的,比较友好

db.AutoMigrate(Cesa{})

  

 

4.5.2 对于表数据的操作(个人感觉Model只是为了更好的指定需要操作的结构体及表格)

增:

第一种方式(直接使用db.Create)

// 通过指针申明需要增加的数据

test := &Test{
    ID:3,
    Name:"jackie",
    Age:18,
}


// 增加数据

db.Create(test)

第二种方式(使用db.Model)

// 通过指针申明需要增加的数据

test := &Test{
    ID:3,
    Name:"jackie",
    Age:18,
}


// 增加数据

db.Model(&data).Create(data)

  

删:

第一种方式(直接使用db.Delete)

// 通过指针申明需要删除的数据

test := &Test{
    ID:3,
    Name:"jackie",
    Age:18,
}


// 删除数据

db.Delete(test)

第二种方式(使用db.Model

// 通过指针申明需要删除的数据

test := &Test{
    ID:3,
    Name:"jackie",
    Age:18,
}


// 删除数据

db.Model(&data).Delete(data)

  

改:

①、无法修改主键

②、只关注主键,申明的其它数据无需一一对应(即假使源表数据的name:jacklove,我在申明时却是 Name:"jackie",然后通过Update进行修改,可如下直接修改为“op”)

③、无法修改零值(布尔值的零值是false,可通过将类型从bool设为*bool解决)

// 通过指针申明需要更改的数据

test := &Test{
    ID:3,
    Name:"jackie",
    Age:18,
}


// 更改数据

db.Model(&data).Update("name","op")

  

查:

// 申明一个实例用于接收结果(涉及知识点:结构体实例化)
var testResult Cesa


// 查询
db.Where("name = ?","op").First(&testResult)

fmt.Println("result:",testResult)

4.6 实现原生sql语句

 需要注意的是,示例化了哪个结构体相当于就是对哪个表进行操作,无法实现从该表去实现对另一个表的操作,需要另外定义与之对应的结构体

// 申明一个实例用于接收结果(涉及知识点:结构体实例化)
var testResult Cesa


// 查询
db.Raw("select * from dqm_user_role").Find(&testResult)

fmt.Println("result:",testResult)

4.7 grom进阶

 

posted @ 2020-12-08 18:17  追太阳的🐖  阅读(898)  评论(0编辑  收藏  举报