这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
orm
Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库
它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的sql语句打交道,只要像平时操作对象一样操作它就可以了 。
gorm特点
- 全功能ORM;
- 关联(包含一个,包含多个,属于,多对多,多种包含);
- Callbacks(创建/保存/更新/删除/查找之前/之后);
- 预加载;
- 事务
- 复合主键
- SQL Builder
- 自动迁移
- 日志
- 可扩展,编写基于GORM回调的插件
- 每个功能都有测试
- 开发人员友好
安装命令
go get github.com/jinzhu/gorm
连接操作
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server 下面提供一个示例
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() // 没有这个方法了???
}
数据操作
增加
db.Create(&User{ Name: "张三", Age: 18, Addr: "北京市", Pic: "/static/img.png", })
删除
db.Delete(&user)
更新
user.Name = "lisi"
db.Save(&user)
fmt.Println(user)
查询
var user User
db.First(&user)
fmt.Println(user)
gorm结构体标签使用
`gorm:"<-:create"` 允许读和创建
`gorm:"<-:update"` 允许读和更新
`gorm:"<-"` 允许读和写(创建和更新)
`gorm:"<-:false"` 允许读,禁止写
`gorm:"->"` 只读(除非有自定义配置,否则禁止写)
`gorm:"->;<-:create"` 允许读和写
`gorm:"->:false;<-:create"` 仅创建(禁止从 db 读)
`gorm:"-"` 读写操作均会忽略该字段
`gorm:"autoUpdateTime:nano"` 使用时间戳填纳秒数充更新时间
`gorm:"autoUpdateTime:milli"` 使用时间戳毫秒数填充更新时间
`gorm:"autoCreateTime"` 使用时间戳秒数填充创建时间
gorm字段标签
多个标签之间用分号分开
标签名 说明
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 指定列的默认值
precision 指定列的精度
scale 指定列大小
not null 指定列为 NOT NULL
autoIncrement 指定列为自动增长
embedded 嵌套字段
embeddedPrefix 嵌入字段的列名前缀
autoCreateTime 创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano
autoUpdateTime 创建/更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli
index 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情
uniqueIndex 与 index 相同,但创建的是唯一索引
check 创建检查约束,例如 check:age > 13,查看 约束 获取详情
<- 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限
-> 设置字段读的权限,->:false 无读权限
- 忽略该字段,- 无读写权限