2017-08-15 45 views
-1

我在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以整数保存在数据库中的数据之前,1路。

是否存在另一种方式来保存数据,因为它是为提交(如保存为整数整数值)?

+0

'c.PostForm(key)' - 这会返回什么类型? – zerkms

+0

这将返回字符串值,即以字符串格式保存的方式。 – Swati

+0

那么它不是“保存在数据库中的数据与golang不正确?”那么:-)这是你首先检索“不正确”的数据 – zerkms

回答

1

如果你看看你保存的文档,你可以看到它的财产_id已经是一个数字(而不是字符串),所以是的,这是绝对有可能的。

为什么你最终stringcustomer_id财产存在的原因是因为你保存文档(conditions变量)适用于customer_id属性string值。它是string类型的,因为你的Context.PostForm()返回值返回一个形式值作为string填充它。

如果你希望它是数据库中的一个整数,它conditions设置之前,转换为围棋整数。例如,您可以使用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这样的库以类型感知的方式解组到该结构中。

+0

感谢您的回复。但如果我让我说15个字段,其中5个是整数,然后5次我需要在循环内添加条件。这对我来说不是正确的方式,因为我的数据在运行时应该很大。那么在golang中有没有另一种方法来处理这个问题? – Swati

+0

@Swati查看编辑答案。 – icza

+0

好的谢谢!我会查的。 – Swati

相关问题