当前位置: 首页 > 工具软件 > Go GORM > 使用案例 >

Golang gorm 数据库连接,迁移,索引

洪凯定
2023-12-01

前言

使用golang gorm 库,github:https://github.com/go-gorm/gorm,
文档地址:https://gorm.io/docs。这里以操作mysql为例

安装gorm和gorm mysql 驱动

# install gorm
go get -u gorm.io/gorm

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

连接mysql

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&…&paramN=valueN] 连接参数dsn由 用户名+密码@tcp(mysql服务器地址)/数据库名称?参数设置…
如果要正确处理struct中的time.Time类型要带上parseTime=True
gorm.Config 设置 DisableForeignKeyConstraintWhenMigrating=true,
我们不希望在迁移的时候将外键创建出来。

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:Xrx@1994113@tcp(127.0.0.1:3306)/proxy?charset=utf8mb4&parseTime=True&loc=Local"
	open, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    DisableForeignKeyConstraintWhenMigrating: true,
    })
	if err != nil {
		panic(err)
	}
	fmt.Println(open)
}

模型声明

模型就是一个struct,只不过要嵌入gorm.Model

// gorm.Model
//其中设置了数据库id,created_at,updated_at,deleted_at 字段,是由struct 属性名的蛇形变换得到,以UpdatedAt双驼峰为例,将驼峰小写并以 “_” 相连得到updated_at
type Model struct {
	ID        uint `gorm:"primarykey"`
	CreatedAt time.Time
	UpdatedAt time.Time
	DeletedAt DeletedAt `gorm:"index"`
}

type user struct {
   gorm.Model
}

表名

表名可以实现 Tabler 接口,不实现则以stuct名称的蛇形加复数

type User struct {
	gorm.Model
	Name     string
	Password string
}

//不设置 表名就是 users
func (u User) TableName() string {
	return "user"
}

对应字段修改

也可以不使用gorm.Model,使用自己定义的model去嵌入。这种方法通常用来解决自己的项目数据库字段不符合gorm.Model中定义的字段。如果是创建时间和修改时间字段和数据库中的字段不一样,不建议修改struct中的属性名(CreatedAt,UpdatedAt,DeletedAt),可以通过column:数据库字段名 来指定数据库字段,CreatedAt,UpdatedAt,DeletedAt会随着具体的操作而自动更新时间。

//CreatedAt 对应数据库中create_at
//UpdatedAt 对应数据库中update_at
type Model struct {
	ID        uint `gorm:"primarykey;"`
	CreatedAt time.Time `gorm:"column:create_at"`
	UpdatedAt time.Time `gorm:"column:update_at"`
}

type User struct {
	Model
	Name     string
	Password string
}

迁移

使用 AutoMigrate 根据 model struct 生成数据表

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"time"
)

type User struct {

	// 主键 自带auto_increment
	//bigint unsigned auto_increment primary key
	ID        uint `gorm:"primarykey"`

	//time.time(datetime(3)) 精确到秒,需要unix时间的将time.Time 换成 int
	CreatedAt time.Time
	UpdatedAt time.Time

	//gorm中的index 代表建立普通索引
	//未设置索引名,则默认生成的索引名 = idx + _表名 + _属性名的蛇形
	//由于User未实现TableName,故表明为users
	//索引名为 idx_users_deleted_at
	DeletedAt gorm.DeletedAt `gorm:"index"`

	//type 设置的是数据库字段类型 符合原生sql,default 设置默认值,comment设置备注
	Name     string `gorm:"column:name;type:varchar(50);default:kiki;comment:名称"`
	Password string `gorm:"column:password;type:varchar(50);default:123456"`
}

func getConnect() *gorm.DB {
	dsn := "root:Xrx@1994113@tcp(127.0.0.1:3306)/proxy?charset=utf8mb4&parseTime=True&loc=Local"
	open, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		//禁止创建外键
		DisableForeignKeyConstraintWhenMigrating: true,
	})
	if err != nil {
		panic(err)
	}
	return open
}

func main() {
	connect := getConnect()

	//迁移时设置引擎和默认字符集
	err := connect.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET UTF8").AutoMigrate(&User{})
	if err != nil {
		panic(err)
	}
}

索引

主键索引

  type User struct {
	ID        uint `gorm:"primarykey"`
  }

普通索引

Index:索引名

  type User struct {
	Name string `gorm:"type:varchar(50);Index:idx_name"`
}

唯一索引

uniqueIndex:索引名

type User struct {
	Name string `gorm:"type:varchar(50);uniqueIndex:name_unique_ids"`
}

联合索引

多个字段共用一个索引。联合索引遵循左前缀原则,可以通过设置 priority 优先级来调整字段索引的位置。priority 数值小的在左边,priority 相同则按照在struct中的位置排。priority 默认值 10

type User struct {
	ID        uint `gorm:"primarykey"`
	Name string `gorm:"type:varchar(50);Index:idx_name,priority:11"`
	NickName string `gorm:"type:varchar(50);Index:idx_name,priority:12"`
}

 类似资料: