gorm:结合Model进行数据映射

0、有这样一张表

CREATE TABLE `news_category` (
  `category_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `category_name` varchar(255) DEFAULT NULL,
  `category_remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='新闻分类表';

1、和模型映射

package model

type NewsCategoryModel struct {
	CategoryId int
	CategoryName string
	CategoryRemark string
}

3、测试几个功能
文档地址:http://gorm.io/docs/query.html

	db, err := gorm.Open("mysql", "root:root@/test?charset=utf8mb4&parseTime=True&loc=Local")
	defer db.Close()
	if err != nil {
		log.Fatal(err)
	}
	// 打开日志日志,查看执行的sql
	db.LogMode(true)

	model := &model.NewsCategoryModel{}
	db.Table("news_category").First(&model) //指定表名称,取第一条
	fmt.Println(model) //打印:&{1 财经 财经类节目说明}

成功取出表第一行数据

4、字段映射

CREATE TABLE `news_category` (
  `category_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `category_name` varchar(255) DEFAULT NULL,
  `category_remark` varchar(255) DEFAULT NULL,
  `type` tinyint(4) NOT NULL DEFAULT '1',
  PRIMARY KEY (`category_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='新闻分类表';

表字段中有type

type NewsCategoryModel struct {
	CategoryId int
	CategoryName string
	CategoryRemark string
	CategoryType int //如何映射
}

模型中定义的是CategoryType,如何映射?

type NewsCategoryModel struct {
	CategoryId     int
	CategoryName   string
	CategoryRemark string
	CategoryType   int `gorm:"Column:type"`
}

详细用法参考文档:http://gorm.io/docs/models.html

5、根据主键ID来取

	//
	db.Table("news_category").First(&model, 2)

这样可以吗?不行。
它执行的sql是这样的:

 SELECT * FROM `news_category`  WHERE (`news_category`.`` = 2) LIMIT 1  

没有指定主键字段是哪个


type NewsCategoryModel struct {
	CategoryId     int	`gorm:"PRIMARY_KEY"`
	CategoryName   string
	CategoryRemark string
	CategoryType   int `gorm:"Column:type"`
}

这样就好了。

6、取出多条

	//定义切片
	var categorys []model.NewsCategoryModel

	//where条件查询
	db.Table("news_category").Find(&categorys)
	fmt.Println(categorys)	//打印:[{1 财经 财经类节目说明 1} {2 技术 技术类节目说明 2} {3 体育 体育类节目说明 3}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
为了实现最高效的转换和存储,可以使用以下步骤: 1. 将前端传来的 Object3DJson 和 ThreeSceneJson 数据转换为 Object3DDb 和 ThreeSceneDb 数据。 2. 在增加 Object3DDb 数据时,同时增加对应的 ThreeSceneDb 数据。在删除 Object3DDb 数据时,同时删除对应的 ThreeSceneDb 数据。 3. 在更新 Object3DDb 数据时,如果 Version 字段发生变化,同时更新对应的 ThreeSceneDb 数据的 Version 字段。 4. 对于查询 Object3DJson 数据,可以使用 gorm 的分页查询功能,根据 SceneID 字段进行查询并返回分页结果。 5. 对于查询 ThreeSceneJson 数据,直接查询数据库并返回所有数据即可。 以下是代码示例: ```go // Object3DJson 转 Object3DDb func object3DJsonToObject3DDb(object3DJson *Object3DJson) *Object3DDb { return &Object3DDb{ SceneID: strconv.Atoi(object3DJson.SceneID), Uuid: strconv.Atoi(object3DJson.Uuid), Type: object3DJson.Type, AdditionalData: object3DJson.AdditionalData, Version: strconv.Atoi(object3DJson.Version), } } // ThreeSceneJson 转 ThreeSceneDb func threeSceneJsonToThreeSceneDb(threeSceneJson *ThreeSceneJson) *ThreeSceneDb { return &ThreeSceneDb{ SceneID: strconv.Atoi(threeSceneJson.SceneID), Type: threeSceneJson.Type, AdditionalData: threeSceneJson.AdditionalData, Version: strconv.Atoi(threeSceneJson.Version), } } // 增加 Object3DDb 数据,同时增加对应的 ThreeSceneDb 数据 func addObject3DDb(object3DDb *Object3DDb) error { // 增加 Object3DDb 数据 if err := db.Create(object3DDb).Error; err != nil { return err } // 增加对应的 ThreeSceneDb 数据 threeSceneDb := &ThreeSceneDb{ SceneID: object3DDb.SceneID, Type: object3DDb.Type, Version: object3DDb.Version, } if err := db.Create(threeSceneDb).Error; err != nil { return err } return nil } // 删除 Object3DDb 数据,同时删除对应的 ThreeSceneDb 数据 func deleteObject3DDb(sceneID string) error { // 删除 Object3DDb 数据 if err := db.Where("scene_id = ?", sceneID).Delete(&Object3DDb{}).Error; err != nil { return err } // 删除对应的 ThreeSceneDb 数据 if err := db.Where("scene_id = ?", sceneID).Delete(&ThreeSceneDb{}).Error; err != nil { return err } return nil } // 更新 Object3DDb 数据,同时更新对应的 ThreeSceneDb 数据的 Version 字段 func updateObject3DDb(object3DDb *Object3DDb) error { // 更新 Object3DDb 数据 if err := db.Save(object3DDb).Error; err != nil { return err } // 更新对应的 ThreeSceneDb 数据的 Version 字段 if err := db.Model(&ThreeSceneDb{}).Where("scene_id = ?", object3DDb.SceneID).Update("version", object3DDb.Version).Error; err != nil { return err } return nil } // 查询 Object3DJson 数据,根据 SceneID 进行分页查询 func getObject3DJson(sceneID string, pageNum, pageSize int) ([]*Object3DJson, error) { var object3DDbList []*Object3DDb if err := db.Where("scene_id = ?", sceneID).Limit(pageSize).Offset((pageNum - 1) * pageSize).Find(&object3DDbList).Error; err != nil { return nil, err } object3DJsonList := make([]*Object3DJson, len(object3DDbList)) for i, object3DDb := range object3DDbList { object3DJsonList[i] = &Object3DJson{ SceneID: strconv.Itoa(object3DDb.SceneID), Uuid: strconv.Itoa(object3DDb.Uuid), Type: object3DDb.Type, AdditionalData: object3DDb.AdditionalData, Version: strconv.Itoa(object3DDb.Version), } } return object3DJsonList, nil } // 查询 ThreeSceneJson 数据,返回所有数据 func getThreeSceneJson() ([]*ThreeSceneJson, error) { var threeSceneDbList []*ThreeSceneDb if err := db.Find(&threeSceneDbList).Error; err != nil { return nil, err } threeSceneJsonList := make([]*ThreeSceneJson, len(threeSceneDbList)) for i, threeSceneDb := range threeSceneDbList { threeSceneJsonList[i] = &ThreeSceneJson{ SceneID: strconv.Itoa(threeSceneDb.SceneID), Type: threeSceneDb.Type, AdditionalData: threeSceneDb.AdditionalData, Version: strconv.Itoa(threeSceneDb.Version), } } return threeSceneJsonList, nil } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值