开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
今天来学习一下数据库相关的知识,学习下Go语言中的Gorm框架来操作数据库,这一个非常对开发人员非常友好的ORM库,和我一起来学习下吧!
概述
Gorm的概念
- 包含ORM的所有特性
- 一对一,一对多,多对一,多对多,多态关联
- Before、After Create、Save、Update、Delete、Find
- 预加载、事务、复合主键、SQL构造器、日志等
安装
go get -u github.com/jinzhu/gorm
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
快速开始
package main
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
//自动检查 Product 结构是否变化,变化则进行迁移
db.AutoMigrate(&Product{})
// 添加
db.Create(&Product{Code: "YYQQ", Price: 200})
// 查找
var product Product
db.First(&product, 1) // 找到id为1的产品
db.First(&product, "code = ?", "YYQQ") // 找出 code 为 YYQQ 的产品
// 修改 - 更新产品的价格为 2000
db.Model(&product).Update("Price", 2000)
// 删除 - 删除产品
db.Delete(&product)
}
运行上述代码可能会遇到:
模型定义
这里的模型的定义也一般用的都是Go语言自带的基本数据类型结构体或者指针,例如下面定义一个User
type User struct {
gorm.Model
Name string
Age sql.NullInt64
Birthday *time.Time
Email string `gorm:"type:varchar(100);unique_index"`
Role string `gorm:"size:255"` //设置字段的大小为255个字节
MemberNumber *string `gorm:"unique;not null"` // 设置字段 memberNumber 唯一且不为空
Num int `gorm:"AUTO_INCREMENT"` // 设置字段 Num自增
Address string `gorm:"index:addr"` // 设置字段Address创建一个名为`addr`的索引
IgnoreMe int `gorm:"-"` //忽略这个字段
CreatedAt time.Time
UpdatedAt time.Time
//使用 `CreatedAt`、`UpdatedAt` 字段追踪创建时间、更新时间
}
结构标签
标签是声明模型时候可以选择的标记,如下所示:
常用结构体标签
| 标签 | 说明 |
|---|---|
| Column | 指定列的名称 |
| Type | 指定列的类型 |
| Size | 指定列的大小,默认是 255 |
| PRIMARY_KEY | 指定一个列作为主键 |
| UNIQUE | 指定一个唯一的列 |
| DEFAULT | 指定一个列的默认值 |
| PRECISION | 指定列的数据的精度 |
| NOT NULL | 指定列的数据不能是空的 |
| AUTO_INCREMENT | 指定一个列的数据是否自增 |
| INDEX | 创建带或不带名称的索引,同名创建复合索引 |
| UNIQUE_INDEX | 类似 索引,创建一个唯一的索引 |
| EMBEDDED | 将 struct 设置为 embedded |
| EMBEDDED_PREFIX | 设置嵌入式结构的前缀名称 |
| autoCreateTime | 创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano |
| autoUpdateTime | 创建/更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli |
| index | 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情 |
| uniqueIndex | 与 index 相同,但创建的是唯一索引 |
| check | 创建检查约束,例如 check:age > 13,查看 约束 获取详情 |
| <- | 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限 |
| -> | 设置字段读的权限,->:false 无读权限 |
| - | 忽略该字段,- 表示无读写,-:migration 表示无迁移权限,-:all 表示无读写迁移权限 |
| comment | 迁移时为字段添加注释 |
有关联的结构标签
| 标签 | 说明 |
|---|---|
| MANY2MANY | 指定连接表名称 |
| FOREIGNKEY | 指定外键 |
| ASSOCIATION_FOREIGNKEY | 指定关联外键 |
| POLYMORPHIC | 指定多态类型 |
| POLYMORPHIC_VALUE | 指定多态的值 |
| JOINTABLE_FOREIGNKEY | 指定连接表的外键 |
| ASSOCIATION_JOINTABLE_FOREIGNKEY | 指定连接表的关联外键 |
| SAVE_ASSOCIATIONS | 是否自动保存关联 |
| ASSOCIATION_AUTOUPDATE | 是否自动更新关联 |
| ASSOCIATION_AUTOCREATE | 是否自动创建关联 |
| ASSOCIATION_SAVE_REFERENCE | 是否引用自动保存的关联 |
| PRELOAD | 是否自动预加载关联 |
总结
今天浅谈了Go与Gorm(一),主要介绍了相关的写法和一些标签的定义,接下来会继续深入了解GORM的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!