gorm学习笔记

156 阅读2分钟

一、概述

gorm

gorm就是基于Go语言实现的ORM库。 类似于Java生态里大家听到过的Mybatis、Hibernate、SpringData等 (grom原文档|)

orm

Object-Relationl Mapping,他与其他数据库的中间件类似,表示数据库数据与实体对象之间的映射关系,隔离了数据库的操作,使得我们在数据库的CRUD中,重点关于对象的操作,而不是底层数据的操作。方便我们在实现数据库操作的时候不用去写复杂的sql语句。

二、如何使用

连接mysql为例子

dsn := "root:pass(127.0.0.1:3306)/dbname?charset=utf8mb4\&parseTime=True\&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), \&gorm.Config{})
db.SingularTable(true)
if err != nil {
panic("failed to connect database")
}
  • 在gorm.Config{}可以做一些配置,
  • SkipDefaultTransaction: true跳过默认开启事务模式。
  • NamingStrategy允许用户通过覆盖默认的NamingStrategy来更改命名约定
NamingStrategy: schema.NamingStrategy{ 
TablePrefix: "t_", // 表名前缀,`User`表为`t_users` 
SingularTable: true, // 使用单数表名,启用该选项后,`User` 表将是`user`
}

更多配置操作可以参考github.com/go-gorm/mys…

开始CRUD

简单的增删改查

test := &Test{
        ID:3,
        Name:"jackie",
        Age:18,
    }
    db.Create(test)
    db.Delete(test)  
    db.Model(&test).Update("name", "world")
    var testResult Test
    db.Where("name = ?", "hello").First(&testResult)
    fmt.Println("result: ", testResult)

表名和结构体映射

通过Table API声明

db.Table("test").Where("name = ?", "hello").First(&testResult)

事务操作

通过db.Transaction函数来操作事务,当闭包函数出现错误的时候,函数就会回滚,确保了读写操作的原子性

db.Transaction(func(tx *gorm.DB) error { 
    // 在事务中执行一些 db 操作
    if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { 
    // 返回任何错误都会回滚事务 
        return err 
        } 
    if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { 
        return err 
        } // 返回 nil 提交事务 
    return nil 
    })

三、使用过程中踩到的坑

表名出错

错误Table 'DB.tests' doesn't exist,但我的表名应该是test。GORM 使用结构体名的 蛇形命名 作为表名。对于结构体 test名为 users 解决  db.SingularTable(true)
通过db.SingularTable(true),gorm会在创建表的时候去掉”s“的后缀