指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

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("数据删除成功")