前言
对于golang中使用gorm操作mysql,可能其他的操作都是固定的,唯一麻烦的就是字段的映射。
gorm允许自己定义一个表的结构映射,但是,golang中,首字母大写来表示public或者private,而gorm在做映射的时候,大写的转化是不一样的。这里就做一下区分。
1.直接使用表的机构映射
比如你用find之类不需要写表名称,直接用结构获取的情况下,struct的机构和数据库中的结构要一致,不一样的用gorm:"column:nameSpace"
,这个来说明,column里面就是你想要映射的名称。
2.定义自己的结构
这么定义的话,就不要求完全一样。
这里又分两种
一,你如果没有用row,直接一条语句末尾加Scan(&struct),这么来接受的,需要字段名称对应,也可以这个可以首字母大写,前提是数据库中表没有其他大写,如果数据库表内字段有其他大写,则使用gorm:"column:nameSpace"
来重新定义在数据库中使用的名称。
二,没有直接返回结果,而是返回一个rows,在next内接受结果,这样的话,就不用注重名称,只需要顺序对应好即可。比如你的struct第一个成员代表name,那就写在表name的那一列上就好。
以下是一个小例子,注释里面的是另一种写法
package main
import (
"log"
_ "github.com/go-sql-driver/mysql"
)
type TestTable struct {
NameSpace string `gorm:"column:nameSpace"`
Age int
Address string
}
func main() {
db, err := DbOpen("mysql", "root:123456@(127.0.0.1:3306)/stbtest?charset=utf8")
if err != nil {
log.Println(err)
return
}
defer DbClose(db)
st := TestTable{}
db.Table("test").Where("nameSpace=? and age = ?", "aa", 1).Scan(&st)
// row, err := db.Table("test").Rows()
// for row.Next() {
// row.Scan(&st.NameSpace, &st.Age, &st.Address)
// log.Println("||", st.NameSpace, "||", st.Age, "||", st.Address)
// }
log.Println("||", st.NameSpace, "||", st.Age, "||", st.Address)
if err != nil {
log.Println(err)
return
}
}
有疑问加站长微信联系(非本文作者)