Gorm| 青训营笔记

65 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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 无读权限
-	忽略该字段,- 无读写权限