1、GORM介绍
1.1 什么是ORM
Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
1.2 GORM
什么是GORM:
Gorm是一个神奇的,对开发人员友好的Golang ORM库(类比Java中的Mybatis)。ORM(Object-Relational Mapping)框架是一种将对象模型表示映射到关系型数据库的技术。它可以帮助开发人员将数据从数据库中提取出来,封装成对象,并且将对象的属性与关系数据库中的表和列进行映射。这样开发人员就可以使用面向对象的方式操作数据库,而无需关心底层数据库的细节ORM框架通常包含对象模型和关系模型之间的映射代码,这个映射可以使用注解、XML配置文件、DSL等方式进行定义。同时ORM框架还提供了一些其他的功能,例如缓存、事务管理和查询优化等,这些功能都可以提高应用程序的性能和开发效率。常见的Go语言ORM框架有GORM、XORM、beego ORM等。
特点:
- 全功能ORM;
- 关联(包含一个,包含多个,属于,多对多,多种包含);
- Callbacks(创建/保存/更新/删除/查找之前/之后);
- 预加载;
- 事务
- 复合主键
- SQL Builder
- 自动迁移
- 日志
- 可扩展,编写基于GORM回调的插件
- 每个功能都有测试
- 开发人员友好
1.3 安装
终端输入:
go get github.com/jinzhu/gorm
2、连接数据库
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
2.1 连接MySQL
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 用户名:密码@tcp(ip:port)/数据库?charset=utf8mb4&parseTime=True&loc=Local
dsn := "root:root123@tcp(127.0.0.1:3306)/test_gorm?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
// 释放连接
db.Close()
}
2.2 数据操作
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
Id int
Name string
Age int
Addr string
Pic string
}
func main() {
dsn := "root:root123@tcp(127.0.0.1:3306)/test_gorm?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
// 自动迁移
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})
// 增
db.Create(&User{
Name: "张三",
Age: 18,
Addr: "汕头市",
Pic: "/static/img.png",
})
// 查
var user User
db.First(&user)
fmt.Println(user) // {1 张三 18 汕头市 /static/img.png}
// 改
user.Name = "lisi"
db.Save(&user)
fmt.Println(user) // {1 lisi 18 汕头市 /static/img.png}
// 删
db.Delete(&user)
}
3、字段声明
| 标签名 | 说明 |
|---|---|
| column | 指定 db 列名 |
| type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null、size, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INSTREMENT |
| size | 指定列大小,例如:size:256 |
| primaryKey | 指定列为主键 |
| unique | 指定列为唯一 |
| default | 指定列的默认值 |