gorm

go的orm

01 介绍和简单应用

  • 安装gorm
go get -u github.com/jinzhu/gorm

连接不同的数据库要导入不同的驱动,gorm包装了一些驱动,只需要导入数据库驱动就行了

import _ "github.com/jinzhu/gorm/dialects/mysql"
// import _ "github.com/jinzhu/gorm/dialects/postgres"
// import _ "github.com/jinzhu/gorm/dialects/sqlite"
// import _ "github.com/jinzhu/gorm/dialects/mssql"
  • 连接mysql
package main

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

func main() {
	dsn := "root:12345678@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local"
	DB, _ := gorm.Open("mysql", dsn) // 是*gorm.DB类型
	defer DB.Close()
}

注意:

DB是*gorm.DB类型

  • 简单应用
package main

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

// 购物信息
type Shopping struct {
	Id      int
	Name    string
	Message string
}


func main() {
	dsn := "root:12345678@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local"
	DB, _ := gorm.Open("mysql", dsn) // 是*gorm.DB类型
	defer DB.Close()
  
  DB.AutoMigrate(&Shopping{}) // 自动迁移数据库
  
  // 新增数据
  shop1 := Shopping{
		Id:      1,
		Name:    "apple",
		Message: "apple is cool",
	}
	DB.Create(&shop1)
  
  // 查询数据
  shop2 := &Shopping{
		Id: 2,
  } // 也可以 shops := new(Shoping)
  DB.First(shop2) // 查询id为2的第一个数据
  fmt.Println(shop2)
  
  var shop3 Shopping
	DB.Find(&shop3, "id=?", 1) // 第二个参数是相当于sql语句的where,后两个参数可以不填,默认是所有数据的最后一个
  fmt.Println(shop3)
  
  // 修改数据
  DB.Model(&shop2).Update("Name", "mac") // 把Id等于2的Name字段改为mac
  
  // 删除数据
  	DB.Delete(&shop2) // 把Id等于2的数据删除
}

注意:

​ 查询时DB.First()参数必须是指针

02 模型定义

模型一般都是普通的结构体

默认使用id 作为主键

type User struct {
  gorm.Model
  Name         string
  Age          sql.NullInt64
  Birthday     *time.Time
  Email        string  `gorm:"type:varchar(100)"` // varchar类型
  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:"-"` //忽略这个字段
}

支持的结构体标签

![image-20210311185714796](/Users/user/Library/Application Support/typora-user-images/image-20210311185714796.png)

关联的结构标签

![image-20210311185816818](/Users/user/Library/Application Support/typora-user-images/image-20210311185816818.png)

Gorm.Model

是一个包含四个特殊字段的结构体:

ID:主键

CreateAt:首次创建时间

UpdatedAt:每次更新的当前时间

DeletedAt:有该字段时,当删除实例时,并没有被从数据空删除,只是把该字段设置为当前时间

可以嵌入自定义的模型中

package main

import "github.com/jinzhu/gorm"

type Shopping struct {
	gorm.Model
	Name    string `gorm: "type:varchar(128);default:lynn"`
	Message string
}
  • 表名设置

默认的是结构体名称的复数

可以禁用默认的配置,就是结构体名称本身

package main

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

func main() {
	dsn := "root:12345678@(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True&loc=Local"
	DB, _ := gorm.Open("mysql", dsn) 
  DB.SingularTable(true) // 禁用表名变成复数
	defer DB.Close()
}

自定义表名

DB.Table("new_user").CreateTable(&User{}) // 指定new_user 为结构体User的表名

g修改默认表名

gorm.DefaultTableNameHandler(DB, "默认表名")
  • 列名设置
package shop

import "github.com/jinzhu/gorm"

type Shopping struct {
	gorm.Model
	NameInfo    string `gorm: "column:name_info"` //  设置NameInfo的数据库字段名为name_info
	Message string
}

03 gorm的CRUD

1 创建

2 查询

3 更新

4 删除

posted @ 2021-03-15 10:34  tianzhh_lynn  阅读(96)  评论(0编辑  收藏  举报