浅谈Go与Gorm(一)

217 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

今天来学习一下数据库相关的知识,学习下Go语言中的Gorm框架来操作数据库,这一个非常对开发人员非常友好的ORM库,和我一起来学习下吧!

概述

Gorm的概念

  1. 包含ORM的所有特性
  2. 一对一,一对多,多对一,多对多,多态关联
  3. Before、After Create、Save、Update、Delete、Find
  4. 预加载、事务、复合主键、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)
}

运行上述代码可能会遇到:

image.png 需要安装tdm-gcc,官网地址: 点此进入

image.png

模型定义

这里的模型的定义也一般用的都是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的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!