Bootstrap

gorm简介

【1】ORM:
即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它们就可以了。

【2】GORM
gorm是go语言的一个orm框架,Golang写的,开发人员友好的ORM库。

【3】中文文档:
https://gorm.io/zh_CN/docs/

【4】安装GORM:
录入安装GORM的命令

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql


案列:
【1】创建一个数据库:testgorm

package main

import (
	"fmt"
	"gorm.io/driver/mysql" //引入mysql驱动
	"gorm.io/gorm"
)

func main() {

	//连接数据库:
	//参数:指的是数据库的设置信息:用户名:密码@tcp(ip:port)/数据库名字?charset=utf8&parseTime=True&loc=Local
	//charset=utf8设置字符集
	//parseTime=True为了处理time.Time
	//loc=Local时区设置,与本地时区保持一致
	dsn := "root:root@tcp(127.0.0.1:3306)/testgorm?charset=utf8&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err) //如果出错,后续代码没有必要执行,想让程序中断,panic来执行即可
	}

	//创建表方式一:通常情况下,数据库中新建的表的名字是结构体名字的复数形式,例如结构体User,表名users
	if err := db.AutoMigrate(&User{}); err != nil {
		panic(err)
	}
	//创建表方式二:Table方法可以指定你要创建的数据库的表名
	if err := db.Table("user").AutoMigrate(&User{}); err != nil {
		panic(err)
	}

	//删除表
	if !db.Migrator().HasTable(&User{}) {
		fmt.Println("table does not exist")
	} else {
		if err := db.Migrator().DropTable(&User{}); err != nil {
			panic(err)
		}
	}


}

// 定义结构体
type User struct {
	Age  int
	Name string
}

【2】表名自定义规则

//【1】模型名称和表名的映射规则:
//1、如果模型名没有驼峰命名,那么表名就是:模型名小写+复数形式:如模型名User---》表名users
//2、如果模型名有驼峰命名,那么表名就是:大写变小写并在前面加下划线,最后加复数形式:如模型名UserInfo---》表名user_infos
//3、如果模型名有连续的大写字母,那么表名就是:连续的大写字母变小写,驼峰前加下划线,字母变小写,最后加复数形式:如模型名:DBUserInfo---》表名db_user_infos
type User struct {
	Age  int
	Name string
}


type MyUser struct {
	Age  int
	Name string
}

//自定义表名
func (MyUser) TableName() string {
	return "test_my_user"
}

【3】gorm.Model匿名字段

只需要再自己的模型中指定gorm.Model匿名字段,即可在数据库表中包含四个字段:ID,CreatedAt,UpdatedAt,DeletedAt
ID:主键自增长
CreatedAt:用于存储记录的创建时间
UpdatedAt:用于存储记录的修改时间
DeletedAt:用于存储记录的删除时间
代码:

type MyUser2 struct {
	gorm.Model
	Age  int
	Name string
}

【4】通过结构体标签gorm来实现表的约束 

(1)-: 忽略,不映射这个字段 eg:gorm:"”,适合:一些冗余字段,不想在数据库中体现,只想在结构体中体现

(2)primary key:主键eg:gorm:"primary key
(3)AUTO INCREMENT:自增 eg:`gorm:"AUTO INCREMENT"

(4)not null:不为空,默认为空 eg:gorm:"not null"
(5)index:索引,eg:gorm:"index"
创建索引并命名:eg:gorm:"index:idx name_code"

(6)unique index:唯一索引 eg:`gorm:"unique index"唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的。

(7)unique:唯-eg:gorm:"unique"

(8)column:指定列名eg:`gorm:"column:user name

(9)size:字符串长度,默认为255 eg:gorm:"size:10"`
(10)default`default:'男”默认值
(11)type:设置sql类型 eg:gorm:"type:int(2)"
PS:多个属性值之间用分号分隔

代码:

type Student struct {
	StuID   int    `gorm:"primary_key;AUTO_INCREMENT"`
	Name    string `gorm:"not null"`
	Age     int    `gorm:"unique_index"` //`gorm:"index:name_index"`
	Email   string `gorm:"unique"`
	Sex     string `gorm:"column:gender;size:10"`
	Desc    string `gorm:"-"`
	Classno string `gorm:"type:int"`
}

;