gin_gorm

一、使用形式

1、引入gorm包

import "github.com/jinzhu/gorm"

2、导入数据库驱动

import _ "github.com/go-sql-driver/mysql"

为了方便记住导入路径,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:
1、
import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)
2、
import (
	"github.com/jinzhu/gorm"
	_ "github.com/go-sql-driver/mysql"
)

3、连接数据库

// 连接数据库
	 用户名:密码@tcp(ip:port)/数据库?charset=utf8&parseTime=True&loc=Local
	db, err := gorm.Open("mysql", "root:123456@tcp(localhost:3306)/go_project?charset=utf8&parseTime=True&loc=Local")

	if err != nil {
		panic(err)
	}
	defer db.Close() // 关闭空闲的连接

4.DDL操作

type User struct {
    Id int
    Name string
    Age int
}


// 创建表
db.Table("user").CreateTable(&User{})   // 指定表名

db.CreateTable(&User{})                 // 不指定表名,模型后面会加个s

DML操作

// 1. 增
	//db.Create(&models.User{Name: "李四", Age: 18, Addr: "xxx", Pic: "/static/upload/pic.png", Phone: "123456789"})

	//查询
	var user models.User
	//db.First(&user, 1) // 默认id
	//db.First(&user, "name=?", "张三") //  // 指定字段
	//fmt.Println(user)

	// 更新
	//db.First(&user, 1)
	//db.Model(&user).Update("age", 22)
	//db.Model(&user).Update("addr", "zs-xxxx")

	// 删除
	db.First(&user, 2)
	db.Delete(&user)

模型定义

用作数据库数据转换和自动建表

模型名和表名的映射关系

  1. 规则
    • 第一个大写字母变为小写,
    • 遇到其他大写字母变为小写并且在前面加下划线,
    • 连着的几个大写字母,只有第一个遵循上面的两条规则,其他的大写字母转为小写,不加下划线,遇到小写,前面的第一个大写字母变小写并加下划线
    • 复数形式
  2. 举例
    • User --> users 首字母小写,复数
    • UserInfo --> user_infos
    • DBUserInfo --> db_user_infos
    • DBXXXXUserInfo --> dbxxxx_user_infos

在默认表名上加其他规则

// 在默认表名前加sys_前缀

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


自定义表名:
func (模型) TableName() string{
    return "新的表名"
}


package models

import "github.com/jinzhu/gorm"

type GormModel struct {
	gorm.Model
	Name string
}

func (GormModel) TableName() string {
	return "test_gorm_model"
}

结构体字段名和列名的对应规则

  1. 规则 * 列名是字段名的蛇形小写
  2. 举例
    • Name --> name
    • CreatedTime --> create_time
  3. 可以通过gorm标签指定列名,AnimalId int64 `gorm:"column:beast_id"`

gorm.Model

基本模型定义gorm.Model,包括字段ID,CreatedAt,UpdatedAt,DeletedAt

只需要在自己的模型中指定gorm.Model匿名字段,即可使用上面的四个字段

// 添加字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`
type User struct {
    gorm.Model
    Name string
}

ID:主键自增长

CreatedAt:用于存储记录的创建时间

UpdatedAt:用于存储记录的修改时间

DeletedAt:用于存储记录的删除时间

结构体标签gorm的使用 

type UserInfo struct {
    Id int `gorm:"primary_key"`
    Name string `gorm:"index"`
    Age int 
}

gorm标签属性值

  • -: 忽略,不映射这个字段 `gorm:"-"`
  • primary_key:主键 `gorm:"primary_key"`
  • AUTO_INCREMENT:自增 `gorm:"AUTO_INCREMENT"`
  • not null:不为空,默认为空 `gorm:"not null"`
  • index:索引, `gorm:"index"`
    • 创建索引并命名: `gorm:"index:idx_name_code"`
    • 优化查询,相当于图书的目录
  • unique_index:唯一索引 `gorm:"unique_index"`

  • unique:唯一 `gorm:"unique"`

  • column:指定列名 `gorm:"column:user_name"`

  • size:字符串长度,默认为255 `gorm:"size:64"`

  • type:设置sql类型 `gorm:"type:varchar(100)"` // 不推荐直接改类型
  • default `default:'galeone'` 默认值

多个属性值之间用分号分隔(英文的;):`gorm:"size:64;not null"`

 一对一

package relate_tables

// 一对一
type User struct {
	Id   int
	Name string
	Age  int
	Addr string
}

type UserProfile struct {
	Id     int
	Pic    string
	CPic   string
	Phone  string
	User   User // 关联关系
	UserID int
}

 

// 一对一
// 属于
type User struct {
	Id   int
	Name string
	Age  int
	Addr string
}

type UserProfile struct {
	Id    int
	Pic   string
	CPic  string
	Phone string
	//User   User // 关联关系
	User User `gorm:"ForeignKey:UId;AssociationForeignKey:Id"` // 关联关系
	//UserID int // 默认关联字段
	UId int //uid
}

 包含

// 包含

type User struct {
	Id int
	Name string
	Age int
	Addr string
	PId int

}


type UserProfile struct {
	Id int
	Pic string
	CPic string
	Phone string
	User User `gorm:"ForeignKey:PId;AssociationForeignKey:Id"`  // 关联关系

}

 

 一对多

// 一对多

type User2 struct {
	Id int
	Name string
	Age int
	Addr string
	Articles []Article `gorm:"ForeignKey:UId;AssociationForeignKey:Id"`
}

type Article struct {
	Id int
	Title string
	Content string
	Desc string
	// 外键
	UId int
}

 

 多对多

type Article2 struct {
        AId int `gorm:"primary_key:true"`
        Title string
        Content string
        Desc string
        Tags []Tag `gorm:"many2many:Article2s2Tags"`  // ;ForeignKey:AId;AssociationForeignKey:TId

    }

    type Tag struct {
        TId int `gorm:"primary_key:true"`
        Name string
        Desc string
    }

 

 

 一对一操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值