golang操作gorm基本
2016 年 6 月 15 日
前言
对于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 } }