GORM实践|青训营

65 阅读2分钟

GORM实践|青训营

GORMGo Relational Object Mapping)可以让go语言开发者快速,高效的完成对数据库的一系列操作,不管是Postgre,还是mysql等等数据库都兼容,作者是字节跳动的张金柱老师。

下面是实践内容:

//经典学生表
CREATE TABLE `student`
(
    `Id`     bigint(20)  NOT NULL AUTO_INCREMENT,
    `Name`   varchar(20) NOT NULL,
    `score` 	 float       NOT NULL,
    PRIMARY KEY (`Id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8mb4

gorm也有建库方法,不过我们一般不用。

一般我们会建一个go文件来初始化数据库,其中的配置也可以通过读取配置文件来获取,也可以硬编码,记得在入口函数,也就是main方法上使用初始化函数,我就经常忘记,导致会出现空指针异常。

runtime error: invalid memory address or nil pointer dereference

var db *gorm.DB

func InitGormDB() (err error) {
   dB, err := gorm.Open(mysql.New(mysql.Config{
      DSN: fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
         global.Settings.GormInfo.Name, global.Settings.GormInfo.Password, global.Settings.GormInfo.Host, global.Settings.GormInfo.Port, global.Settings.GormInfo.DBName), // DSN data source name
      DefaultStringSize:        171,
      DisableDatetimePrecision: true,
      DontSupportRenameIndex:   true,
   }), &gorm.Config{
      SkipDefaultTransaction:                   false,
      DisableForeignKeyConstraintWhenMigrating: true,
      NamingStrategy: schema.NamingStrategy{
         SingularTable: true,
      },
   })
   if err != nil {
      fmt.Printf("连接失败:%v\n", err)
   }
   db = dB
   return err
}

表创建好了,数据库连接配置也初始化好了,下面就是分析他的各种API了。以下示例是网上抄的,仅做代码分析

//Select方法的作用是选择你操作数据库时需要的字段,比如下面的Student结构体其实有五个字段,但因为用了Select方法,所以他在创建一条新数据的时候,剩下两个字段或为空,或为默认值。
db.Select("Name", "Password", "MajorNum").Create(&model.Student{Name: user.Name, Password: user.Password, MajorNum: user.MajorNum})

当然也有和它对应的,如果你有不需要的字段,可以用以下函数排除掉

db.Omit("Name", "Age", "CreatedAt").Create(&user)

另外Create方法还有一个返回值,我们可以通过判断返回插入记录的条数是否>1来判断插入是否成功

result := db.Create(&user) // 通过数据的指针来创建

user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数

下面的函数是用来查询单条记录,都是官网的示例,看官方示例来学习是最快捷的方式。

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;

// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error        // returns error or nil

还挑了一些比较常用的,一般第二个参数是切片或数组,映射到数据库都是范围查询

db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;

db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);

查询是操作数据库最频繁的手段,所以重点讲了查询方面的API,更新和删除略过,更多内容可以通过官方文档和社区学习。