golang中 已知前端界面需要的json数据格式为 type Object3DJson struct { SceneID string `json:"sceneId" gorm:"primary_key"` Uuid string `json:"uuid" gorm:"index"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version string `json:"version"` } type ThreeSceneJson struct { SceneID string `json:"sceneId" gorm:"primary_key"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version string `json:"version"` } 使用gorm 映射的数据为: type Object3DDb struct { SceneID int64 `json:"sceneId" gorm:"primary_key"` Uuid int64 `json:"uuid" gorm:"index"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version int64 `json:"version"` } type ThreeSceneDb struct { SceneID int64 `json:"sceneId" gorm:"primary_key"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version int64 `json:"version"` } 如何以最高的效率实现转换和存储
时间: 2023-07-19 19:47:48 浏览: 146
您可以使用Golang中的标准库中的"encoding/json"包来进行JSON数据的解析和序列化。对于Gorm ORM,您可以使用它提供的结构体标记来指定表/列名和约束。下面是一种可能的实现方式:
1. 解析前端JSON数据
您可以使用"json.Unmarshal()"函数将前端JSON数据转换为Object3DJson或ThreeSceneJson类型的结构体对象。
2. 转换为Gorm模型对象
您可以将Object3DJson或ThreeSceneJson类型的对象转换为Object3DDb或ThreeSceneDb类型的Gorm模型对象,以便将其存储在数据库中。这可以通过创建一个新的Object3DDb或ThreeSceneDb类型的对象,并将其属性从前端JSON数据结构中复制而来来完成。您可以使用类型转换或手动属性复制等技术来实现此目的。
3. 存储到数据库
最后,您可以使用Gorm的"Create()"函数将Object3DDb或ThreeSceneDb类型的对象存储到数据库中。如果您需要更新现有记录,则可以使用"Save()"函数。
总的来说,这个过程可以在几个步骤中完成,但是要确保您的代码是高效的,您可以使用一些技巧来优化它,例如批量插入和更新。
相关问题
golang中 使用gin 和 gorm 框架实现: 已知前端界面需要的json数据格式为 type Object3DJson struct { SceneID string `json:"sceneId" gorm:"primary_key"` Uuid string `json:"uuid" gorm:"index"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version string `json:"version"` } type ThreeSceneJson struct { SceneID string `json:"sceneId" gorm:"primary_key"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version string `json:"version"` } 使用gorm 映射的数据为: type Object3DDb struct { SceneID int64 `json:"sceneId" gorm:"primary_key"` Uuid int64 `json:"uuid" gorm:"index"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version int64 `json:"version"` } type ThreeSceneDb struct { SceneID int64 `json:"sceneId" gorm:"primary_key"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version int64 `json:"version"` } 如何以最高的效率实现转换和存储。且业务上当更新Object3DDb 数据Version自增1,对应的Object3DDb SceneID 的ThreeSceneDb对应的Version也自增1。 当增删Object3DDb 时,对应的Object3DDb SceneID 的ThreeSceneDb对应的Version也自增1。 要求实现 Object3DJson,ThreeSceneJson 的增上改查 共计8个接口,其中Object3DJson 要求查询条件为 SceneID,且要求分页查询,ThreeSceneJson无需查询条件,直接返回全部。
为了实现最高效的转换和存储,可以使用以下步骤:
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
}
```
golang 使用gorm 将type ThreeScene struct { SceneID string `json:"sceneId" gorm:"primary_key"` Type int `json:"type"` AdditionalData string `json:"additionalData"` Version string `json:"version"` }增删改查 ,且要求SceneID 在数据库内为 int64
如果要使用 GORM 实现对 `ThreeScene` 结构体的增删改查操作,并且要求 `SceneID` 在数据库内为 `int64` 类型,可以按照以下步骤进行:
1. 安装 GORM:
```bash
go get -u gorm.io/gorm
```
2. 创建数据库连接:
```go
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "user:password@tcp(host:port)/db_name?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
}
```
其中,`user` 和 `password` 分别为数据库的用户名和密码,`host` 和 `port` 分别为数据库的地址和端口号,`db_name` 为数据库名称。
3. 定义 `ThreeScene` 结构体:
```go
type ThreeScene struct {
SceneID int64 `json:"sceneId" gorm:"primary_key"`
Type int `json:"type"`
AdditionalData string `json:"additionalData"`
Version string `json:"version"`
}
```
注意,这里将 `SceneID` 的类型从 `string` 改为了 `int64`。
4. 创建表格:
```go
func main() {
// ...
db.AutoMigrate(&ThreeScene{})
}
```
这会自动在数据库中创建一个名为 `three_scenes` 的表格,其中包含 `SceneID`、`Type`、`AdditionalData` 和 `Version` 四个字段。
5. 插入数据:
```go
func main() {
// ...
scene := ThreeScene{
SceneID: 1234567890,
Type: 1,
AdditionalData: "some additional data",
Version: "1.0.0",
}
result := db.Create(&scene)
if result.Error != nil {
panic(result.Error)
}
}
```
这会将一个新的 `ThreeScene` 对象插入到数据库中。
6. 查询数据:
```go
func main() {
// ...
var scene ThreeScene
result := db.First(&scene, "scene_id = ?", 1234567890)
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
fmt.Println("record not found")
} else {
panic(result.Error)
}
} else {
fmt.Printf("%+v\n", scene)
}
}
```
这会查询数据库中 `SceneID` 为 1234567890 的记录,并将结果保存在 `scene` 变量中。
7. 更新数据:
```go
func main() {
// ...
result := db.Model(&ThreeScene{}).Where("scene_id = ?", 1234567890).Update("additional_data", "new additional data")
if result.Error != nil {
panic(result.Error)
}
}
```
这会将 `SceneID` 为 1234567890 的记录的 `AdditionalData` 字段更新为 "new additional data"。
8. 删除数据:
```go
func main() {
// ...
result := db.Delete(&ThreeScene{}, "scene_id = ?", 1234567890)
if result.Error != nil {
panic(result.Error)
}
}
```
这会删除 `SceneID` 为 1234567890 的记录。
注意,在上面的示例代码中,我们使用了 GORM 的链式调用语法,这可以让我们更方便地构建 SQL 语句。同时,我们还使用了 `result.Error` 来检查操作是否成功,这可以避免出现一些难以排查的错误。
阅读全文