GORM基础用法介绍(一) | 青训营笔记

247 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第7天。

GORM是一个使用Go语言编写的ORM框架,在Go语言开发中经常被用到。ORM,是Object–relational mapping的缩写,翻译为对象关系映射。ORM是一种用于在关系数据库和面向对象编程语言的堆之间转换数据的编程技术,它实际上创建了一个可以在编程语言中使用的虚拟对象数据库。

这是GORM系列的第一篇文章,这篇文章将会介绍GORM的优势、模型和使用GORM连接数据库的方法。

GORM的优势

  • GORM支持市面上常见的关系型数据库,例如MySQL、PostgreSQL、SQLite等
  • GORM具有非常详尽的文档,这是中文文档的地址:gorm.io/zh_CN/
  • 全功能ORM,可以使用GORM完成绝大多数数据库操作,而无需通过字符串的形式硬编码数据库命名
  • 有效防止SQL注入攻击,通过硬编码字符串的方式进行SQL操作很可能由于开发者的疏忽而留下SQL注入攻击的漏洞,而使用GORM就能够很好地避免这一问题
  • ...

GORM的模型定义

通过定义标准的Go语言结构体即可定义出GORM的数据模型,GORM倾向于约定优于配置。默认情况下,GORM使用ID作为主键,使用结构体名的蛇形复数作为表名,字段名的蛇形作为列名,并使用CreatedAt、UpdatedAt字段追踪创建、更新时间。此外,通过使用gorm注解,也可以自行定义列名;通过实现TableName方法,可以自行定义表名。下面是一个例子:

type User struct {
  ID   uint   `gorm:"column:a_id"`
  Name string `gorm:"column:a_name"
}

这个模型对应的表结构包括a_ida_name两列,默认情况下,会对应到表名为names的数据表。下面的函数定义了这个结构体对应的数据表的表名:

func (User u) TableName() string {
    return "name_table"
}

现在,User对应的表的表名是name_table。通过定义上面的函数,就可以实现一些例如分表的操作,针对不同的User表项返回不同的表名。

GORM连接数据库

GORM官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB。通过对应的GORM数据库驱动和数据库地址等信息,就可以连接到相应的数据库。以MySQL为例,下面是连接数据库的示例代码:

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

从上面的代码可以看出,GORM连接数据库,需要定义一个dsn,dsn的格式是[username]:[password]@[protocol]([address]:[port])/[dbname]?[arguments],其中,arguments部分有许多可选的参数,以上面的代码为例,charset=utf8mb4指定了数据库的编码格式为utf8mb4parseTime=True指定了需要处理时间,这将会让GORM正常地转换Go语言的time.Time格式与MySQL的DATETIME格式;而loc=Local指定了时区。