在数据库 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 这样的库以类型感知的方式解组到该结构中。
我有以下 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 这样的库以类型感知的方式解组到该结构中。