目录
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表; 这个方法返回一个布尔值
}
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")) //这里面的参数是表的真实名字
}
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
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")
}
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)