Gorm之gorm.Migrator接口详解

Gorm之gorm.Migrator接口详解

1.CreateTable方法

package main

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

//模型结构
type hate struct {
	Id   int
	Name string
	Age  int
}

func main() {
	conn, err := gorm.Open(mysql.New(mysql.Config{
		DSN:               "root:414524@tcp(127.0.0.1:3306)/gotest?charset=utf8mb4&parseTime=True&loc=Local",
		DefaultStringSize: 171,
	}), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "t_",
			SingularTable: true,
		},
	})
	if err != nil {
		fmt.Println(err)
	}
	M := conn.Migrator()   //返回的是一个Migrator接口,Migrator接口里面有很多方法
	M.CreateTable(&hate{}) //
	//这两行等效于conn.AutoMigrate(&hate{})
}

2.HasTable方法1

传入结构体名字
通过结构体的名字的方式去查找数据库里是否存在指定的表;

package main

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

//模型结构
type hate struct {
	Id   int
	Name string
	Age  int
}

func main() {
	conn, err := gorm.Open(mysql.New(mysql.Config{
		DSN:               "root:414524@tcp(127.0.0.1:3306)/gotest?charset=utf8mb4&parseTime=True&loc=Local",
		DefaultStringSize: 171,
	}), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "t_",
			SingularTable: true,   //注意:这两行内容是绝对不可以删除的,否则查找不成功
		},
	})
	if err != nil {
		fmt.Println(err)
	}
	M := conn.Migrator() //返回的是一个Migrator接口,Migrator接口里面有很多方法
	fmt.Println(M.HasTable(&hate{})) //所以写的是结构体的名字,但是会自动去找t_hate表; 这个方法返回一个布尔值
}

image-20220116141542798

3.HasTable方法2

传入表名真实名字
通过表格的真实名字去查找数据库里是否存在指定的表

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)
func main() {
	conn, err := gorm.Open(mysql.New(mysql.Config{
		DSN:               "root:414524@tcp(127.0.0.1:3306)/gotest?charset=utf8mb4&parseTime=True&loc=Local",
		DefaultStringSize: 171,
	}), &gorm.Config{})
	if err != nil {
		fmt.Println(err)
	}
	M := conn.Migrator() //返回的是一个Migrator接口,Migrator接口里面有很多方法
	fmt.Println(M.HasTable("t_hate"))  //这里面的参数是表的真实名字
}

image-20220116142118568

4.DropTable方法1

传入结构体名字
用于删除表;
返回值为error ,若返回 则表明删除成功

package main

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

type hate struct {
	Id   int
	Name string
	Age  int
}

func main() {
	conn, err := gorm.Open(mysql.New(mysql.Config{
		DSN:               "root:414524@tcp(127.0.0.1:3306)/gotest?charset=utf8mb4&parseTime=True&loc=Local",
		DefaultStringSize: 171,
	}), &gorm.Config{NamingStrategy: schema.NamingStrategy{
		TablePrefix:   "t_",
		SingularTable: true,      //注意:这两行内容是绝对不可以删除的,否则删除不成功
	},
	})
	if err != nil {
		fmt.Println(err)
	}
	M := conn.Migrator() //返回的是一个Migrator接口,Migrator接口里面有很多方法
	fmt.Println(M.DropTable(&hate{}))  
}

5.DropTable方法2

传入表名真实名字

fmt.Println(M.DropTable("t_hate"))//也可以传入“表的真实名字为参数

6.RenameTable方法

传入表名真实名字
用于重命名表;
返回值是error类型的

先创建一个表叫做:asd

image-20220116143632071

package main

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

func main() {
	conn, err := gorm.Open(mysql.New(mysql.Config{
		DSN:               "root:414524@tcp(127.0.0.1:3306)/gotest?charset=utf8mb4&parseTime=True&loc=Local",
		DefaultStringSize: 171,
	}), &gorm.Config{})
	if err != nil {
		fmt.Println(err)
	}
	M := conn.Migrator() //返回的是一个Migrator接口,Migrator接口里面有很多方法
	M.RenameTable("asd", "fgh")
}

image-20220116143940552

7.RenameTable方法

传入结构体名字
注:旧名字与新名字也可以传入结构体
比如:

M.RenameTable(&asd{}, "fgh")或者M.RenameTable(&asd{}, &fgh{})

8.列系列方法

type User struct {
  Name string
}

// 添加 name 字段
db.Migrator().AddColumn(&User{}, "Name")
// 删除 name 字段
db.Migrator().DropColumn(&User{}, "Name")
// 修改 name 字段
db.Migrator().AlterColumn(&User{}, "Name")
// 检查字段是否存在
db.Migrator().HasColumn(&User{}, "Name")

type User struct {
  Name    string
  NewName string
}

// 重命名字段
db.Migrator().RenameColumn(&User{}, "Name", "NewName")
db.Migrator().RenameColumn(&User{}, "name", "new_name")

// 获取字段类型
db.Migrator().ColumnTypes(&User{}) ([]*sql.ColumnType, error)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值