Golang之ORM框架Gorm快速开始

Posted 刘小豆豆豆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang之ORM框架Gorm快速开始相关的知识,希望对你有一定的参考价值。

Gorm快速入门

Gorm是Go语言的ORM框架,其特点有:

  • 全特性 ORM (几乎包含所有特性)
  • 模型关联 (一对一, 一对多,一对多(反向), 多对多, 多态关联)
  • 钩子 (Before/After Create/Save/Update/Delete/Find)
  • 预加载
  • 事务
  • 复合主键
  • SQL 构造器
  • 自动迁移
  • 日志
  • 基于GORM回调编写可扩展插件
  • 全特性测试覆盖
  • 开发者友好

快速开始:

  1. 安装

    go get -u github.com/jinzhu/gorm
    
  2. 连接数据库:

       db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
    	if err!= nil
    		panic(err)
    	
    	defer db.Close()
    
  3. 增删改查

    基本信息如下:

// UserInfo 用户信息
type UserInfo struct 
	ID uint
	Name string
	Gender string
	HA string

​ 增加:

u1 := UserInfo3, "枯藤", "男", "篮球"

db.Create(&u1)

​ 查询:

var u = new(UserInfo)
db.First(u)
fmt.Printf("%#v\\n", u)

​ 修改:

db.Model(&u).Update("hobby", "双色球")

​ 删除:

db.Delete(&u)

全部代码:

package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

// UserInfo 用户信息
type UserInfo struct 
	ID uint
	Name string
	Gender string
	HA string


func main() 
   db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
	if err!= nil
		panic(err)
	
	defer db.Close()
	u1 := UserInfo3, "枯藤", "男", "篮球"
	u2 := UserInfo4, "topgoer.com", "女", "足球"
	// 创建记录
	db.Create(&u1)
	db.Create(&u2)
	// 查询
	var u = new(UserInfo)
	db.First(u)
	fmt.Printf("%#v\\n", u)
	var uu UserInfo
	db.Find(&uu, "hobby=?", "足球")
	fmt.Printf("%#v\\n", uu)
	// 更新
	db.Model(&u).Update("hobby", "双色球")
	 删除
	db.Delete(&u)

模型定义:

模型一般为Golang的结构体,Go的基本数据类型或者指针。

例子:

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:"-"` //忽略这个字段

支持的结构标签:

标签说明
Column指定列的名称
Type指定列的类型
Size指定列的大小,默认是 255
PRIMARY_KEY指定一个列作为主键
UNIQUE指定一个唯一的列
DEFAULT指定一个列的默认值
PRECISION指定列的数据的精度
NOT NULL指定列的数据不为空
AUTO_INCREMENT指定一个列的数据是否自增
INDEX创建带或不带名称的索引,同名创建复合索引
UNIQUE_INDEX类似 索引,创建一个唯一的索引
EMBEDDED将 struct 设置为 embedded
EMBEDDED_PREFIX设置嵌入式结构的前缀名称
-忽略这些字段

规范:

gorm.Model 是一个包含一些基本字段的结构体, 包含的字段有 IDCreatedAtUpdatedAtDeletedAt

可以用它来嵌入到模型中,或者也可以用它来建立自己的模型。

// gorm.Model 定义
type Model struct 
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time


// 将字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt` 注入到 `User` 模型中
type User struct 
  gorm.Model
  Name string


// 声明 gorm.Model 模型
type User struct 
  ID   int
  Name string

gorm 默认使用ID作为主键名:

type User struct 
  ID   string // 字段名 `ID` 将被作为默认的主键名


// 设置字段 `AnimalID` 为默认主键
type Animal struct 
  AnimalID int64 `gorm:"primary_key"`
  Name     string
  Age      int64

指定表名:

// 用 `User` 结构体创建 `delete_users` 表
db.Table("deleted_users").CreateTable(&User)

var deleted_users []User
db.Table("deleted_users").Find(&deleted_users)
 SELECT * FROM deleted_users;

db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
 DELETE FROM deleted_users WHERE name = 'jinzhu';

修改表名:

可以通过定义 DefaultTableNameHandler 字段来对表名使用任何规则。

gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  
    return "prefix_" + defaultTableName;

时间戳跟踪:

对于有 CreatedAt 字段的模型,它将被设置为首次创建记录的当前时间。

对于有 UpdatedAt 字段的模型,它将被设置为记录更新时的当前时间。

db.Create(&user) // 将设置 `CreatedAt` 为当前时间
// 你可以使用 `Update` 方法来更改默认时间
db.Model(&user).Update("CreatedAt", time.Now())

db.Save(&user) // 将设置 `UpdatedAt` 为当前时间
db.Model(&user).Update("name", "jinzhu") // 将设置 `UpdatedAt` 为当前时间

自动迁移:

判断UserInfo 信息是否发送改变,若变化则自动迁移,即生成新的列,若没此表则创建此表。

db.AutoMigrate(&UserInfo)

以上是关于Golang之ORM框架Gorm快速开始的主要内容,如果未能解决你的问题,请参考以下文章

Golang之ORM框架Gorm快速开始

golang orm 框架之 gorm

golang orm 框架之 gorm

Go开源世界主流成熟ORM框架gorm实践分享

golang中orm或gorm或json序列化结构体时零值的处理

golang中orm或gorm或json序列化结构体时零值的处理