gorm数据库迁移中:
//多对多数据库迁移
type Article struct {
Id uint `gorm:"primarykey;not null;auto_increment;column:id;"`
Title string `gorm:"type:varchar(15);default:NULL;column:title;comment:标题"`
Detail string `gorm:"type:varchar(15);default:NULL;column:detail;comment:详情"`
Categories []Category `gorm:"many2many:article_has_categories;"`
CreatedAt time.Time `gorm:"type:timestamp;default:NULL;column:created_at;comment:创建时间"`
DeletedAt time.Time `gorm:"type:timestamp;default:NULL;column:deleted_at;comment:创建时间"`
UpdatedAt time.Time `gorm:"type:timestamp;default:NULL;column:updated_at;comment:更新时间"`
CreatedAdminId int `gorm:"type:int;default:NULL;column:created_admin_id;comment:创建人ID"`
UpdatedAdminId int `gorm:"type:int;default:NULL;column:updated_admin_id;comment:更新人ID"`
}
type Category struct {
Id uint `gorm:"primarykey;not null;auto_increment;column:id;"`
Name string `gorm:"type:varchar(15);default:NULL;comment:名称"`
Articles []Article `gorm:"many2many:article_has_categories;"`
CreatedAt time.Time `gorm:"type:timestamp;default:NULL;column:created_at;comment:创建时间"`
DeletedAt time.Time `gorm:"type:timestamp;default:NULL;column:deleted_at;comment:创建时间"`
UpdatedAt time.Time `gorm:"type:timestamp;default:NULL;column:updated_at;comment:更新时间"`
CreatedAdminId int `gorm:"type:int;default:NULL;column:created_admin_id;comment:创建人ID"`
UpdatedAdminId int `gorm:"type:int;default:NULL;column:updated_admin_id;comment:更新人ID"`
}
//①通过 AutoMigrate 实现的数据库迁移,可以实现表之间的关系,比如我这里的 Category 里定义了 many2many tag,通过 AutoMigrate 可以自动创建三张表:
//categories表 article_has_categories表 articles表
//②不能通过手动迁移数据库创建这样的表
//err := common.Db.AutoMigrate(&model.Category{})
//if err != nil {
// fmt.Println("迁移错误:", err)
//}
//
//fmt.Println("迁移完成")
//多对多查询,我发现只能通过Preload查询,Association不生效
//var categories []model.Category
//err := common.Db.Preload("Articles").Find(&categories).Error
//if err != nil {
// fmt.Println("err is:", err)
//}
//
//fmt.Printf("categories are:%+v\n", categories)
//多对多更新
//common.Db.Model(model.Category{}).Where("id = ?", 1).Update("name", "分类111")
//多对多删除,这个得先删除中间表的数据,再删除主表的数据(最然主表数据定义了deleted_at 字段,但是会被硬删除,而不会软删除,这点和laravel还是有区别的)
//这个过程需要事务操作:① 自动事务(和laravel很像,很方便) ② 手动事务
err := common.Db.Transaction(func(tx *gorm.DB) error {
//tx.Exec(""),本来想对中间表执行原生sql删除的,不想定义中间表的model,实际上也不需要,但是我还是定义了
if err := tx.Where("category_id = ?", 2).Delete(&model.ArticleHasCategory{}).Error; err != nil {
return err
}
if err := tx.Where("id = ?", 2).Delete(&model.Category{}).Error; err != nil {
return err
}
return nil
})
if err != nil {
fmt.Println("数据删除失败", err)
}
fmt.Println("数据删除成功")
