zoukankan      html  css  js  c++  java
  • 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进阶

  • 相关阅读:
    python学习笔记3:python读写文件
    python学习笔记3:字典
    python学习笔记3:列表、元组和集合
    python学习笔记2:字符串
    Linux之DNS
    网络安全
    linux之防火墙
    Linux之进程管理命令
    Linux之进程管理基础
    Linux之网络
  • 原文地址:https://www.cnblogs.com/tcarry/p/14104800.html
Copyright © 2011-2022 走看看