在数据库 golang 中保存 post 数据(具有整数和字符串值)的正确方法是什么?

What is the correct way to save post data (with integer and string values) in the database golang?

我有以下 golang 代码:

package main

import (
    "github.com/gin-gonic/gin"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
    "log"
    "time"
)

func main() {
    router := gin.Default()
    router.POST("/save-address", SaveAddress)
    router.Run()
}

func SaveAddress(c *gin.Context){
    var err error
    conditions := bson.M{}
    c.Request.ParseForm()
    for key, _ := range c.Request.PostForm {
        if key != "id"{
            conditions[key] = c.PostForm(key)
        }
    }
    conditions["_id"] = 1
    mongoSession := ConnectDb()

    sessionCopy := mongoSession.Copy()
    defer sessionCopy.Close()

    getCollection := mongoSession.DB("bformssettings").C("address")
    err = getCollection.Insert(conditions)
    if err != nil{
        println(err)
    }else{
        println("Data saved successfully!!!")
    }
}
func ConnectDb() (mongoSession *mgo.Session) {
    mongoDBDialInfo := &mgo.DialInfo{
        Addrs:    []string{"localhost:27017"},
        Timeout:  60 * time.Second,
        Database: "bformssettings",
    }

    mongoSession, err := mgo.DialWithInfo(mongoDBDialInfo)
    if err != nil {
        log.Fatalf("CreateSession: %s\n", err)
    }

    mongoSession.SetMode(mgo.Monotonic, true)

    return mongoSession
}

当我运行代码时,数据库中会保存如下格式的数据:

{ "_id" : 1, "customer_id" : "3", "address" : "Chicago, IL", "city" : "Chicago", "state" : "IL", "zipcode" : "60647" }

问题:

customer_id是一个整数值,但是它会在数据库中保存为字符串。

可能的解决方法:

在将 id 的字符串表示形式保存到数据库之前,可以将其重新转换回整数。

问题:

还有其他方法可以原样保存数据吗?例如。将整数值保存为整数值?

如果您查看保存的文档,您会发现它 _id 属性 已经是一个数字(而不是字符串),所以是的,这绝对是可能的。

你最终得到 customer_id 属性 类型 string 的原因是因为你保存的文档(conditions 变量)包含 string customer_id 属性 的值。它是 string 类型,因为您用 Context.PostForm() 的 return 值填充它,其中 return 是一个作为 string.

的表单值

如果你希望它是数据库中的整数,在conditions中设置它之前将它转换为Go整数。例如,您可以使用 strconv.Atoi()

for key, _ := range c.Request.PostForm {
    value := c.PostForm(key)
    if key == "customer_id" {
        if id, err := strconv.Atoi(value); err != nil {
            // Not a valid number, handle error
        } else {
            conditions[key] = id
        }
    } else {
        if key != "id"{
            conditions[key] = value
        }
    }
}

您必须以某种方式定义哪些字段应该保存整数值。我只是展示了一种使用单个字段执行此操作的方法。如果您有多个,您可以将它们列在一个切片中,并使用单个 for 循环来检测/处理所有;甚至更好,将它们放在一个充当集合的地图中,您可以在没有 for 循环的情况下检测这些字段。

另一种选择是创建一个 struct 类型的表单输入数据模型,并使用像 Gorilla's schema 这样的库以类型感知的方式解组到该结构中。