数据库是业务利用的外围,本节次要解说gin框架(Go语言)操作原生数据库、go语言数据库ORM框架(gorm和xorm)。
1.原生数据库
package main import ( "database/sql" "fmt" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "net/http") var sqlDb *sql.DB //数据库连贯dbvar sqlResponse SqlResponse //响应client的数据func init() { //1、关上数据库 //parseTime:工夫格局转换(查问后果为工夫时,是否主动解析为工夫); // loc=Local:MySQL的时区设置 sqlStr := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8&parseTime=true&loc=Local" var err error sqlDb, err = sql.Open("mysql", sqlStr) if err != nil { fmt.Println("数据库关上呈现了问题:", err) return } //2、 测试与数据库建设的连贯(校验连贯是否正确) err = sqlDb.Ping() if err != nil { fmt.Println("数据库连贯呈现了问题:", err) return }} //Client提交的数据type SqlUser struct { Name string `json:"name"` Age int `json:"age"` Address string `json:"address"`} //应答体(响应client的申请)type SqlResponse struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data"`} func main() { r := gin.Default() //数据库的CRUD--->gin的 post、get、put、delete办法 r.POST("sql/insert", insertData) //增加数据 r.GET("sql/get",getData) //查问数据(单条记录) r.GET("sql/mulget",getMulData)//查问数据(多条记录) r.PUT("sql/update",updateData)//更新数据 r.DELETE("sql/delete",deleteData)//删除数据 r.Run(":9090")} func deleteData(c *gin.Context) { name:=c.Query("name") var count int //1、先查问 sqlStr:="select count(*) from user where name=?" err := sqlDb.QueryRow(sqlStr, name).Scan(&count) if count<=0||err!=nil{ sqlResponse.Code = http.StatusBadRequest sqlResponse.Message = "删除的数据不存在" sqlResponse.Data = "error" c.JSON(http.StatusOK, sqlResponse) return } //2、再删除 delStr:="delete from user where name=?" ret, err := sqlDb.Exec(delStr, name) if err != nil { fmt.Printf("delete failed, err:%v\n", err) sqlResponse.Code = http.StatusBadRequest sqlResponse.Message = "删除失败" sqlResponse.Data = "error" c.JSON(http.StatusOK, sqlResponse) return } sqlResponse.Code = http.StatusOK sqlResponse.Message = "删除胜利" sqlResponse.Data = "OK" c.JSON(http.StatusOK, sqlResponse) fmt.Println(ret.LastInsertId()) //打印后果} func updateData(c *gin.Context) { var u SqlUser err := c.Bind(&u) if err != nil { sqlResponse.Code = http.StatusBadRequest sqlResponse.Message = "参数谬误" sqlResponse.Data = "error" c.JSON(http.StatusOK, sqlResponse) return } sqlStr:="update user set age=? ,address=? where name=?" ret, err := sqlDb.Exec(sqlStr, u.Age, u.Address, u.Name) if err != nil { fmt.Printf("update failed, err:%v\n", err) sqlResponse.Code = http.StatusBadRequest sqlResponse.Message = "更新失败" sqlResponse.Data = "error" c.JSON(http.StatusOK, sqlResponse) return } sqlResponse.Code = http.StatusOK sqlResponse.Message = "更新胜利" sqlResponse.Data = "OK" c.JSON(http.StatusOK, sqlResponse) fmt.Println(ret.LastInsertId()) //打印后果} func getMulData(c *gin.Context) { address:=c.Query("address") sqlStr:="select name,age from user where address=?" rows, err := sqlDb.Query(sqlStr, address) if err!=nil { sqlResponse.Code = http.StatusBadRequest sqlResponse.Message = "查问谬误" sqlResponse.Data = "error" c.JSON(http.StatusOK, sqlResponse) return } defer rows.Close() resUser:=make([]SqlUser,0) for rows.Next(){ var userTemp SqlUser rows.Scan(&userTemp.Name,&userTemp.Age) userTemp.Address=address resUser=append(resUser,userTemp) } sqlResponse.Code = http.StatusOK sqlResponse.Message = "读取胜利" sqlResponse.Data=resUser c.JSON(http.StatusOK, sqlResponse)} func getData(c *gin.Context) { name:=c.Query("name") sqlStr:="select age,address from user where name=?" var u SqlUser err := sqlDb.QueryRow(sqlStr, name).Scan(&u.Age, &u.Address) if err!=nil { sqlResponse.Code = http.StatusBadRequest sqlResponse.Message = "查问谬误" sqlResponse.Data = "error" c.JSON(http.StatusOK, sqlResponse) return } u.Name=name sqlResponse.Code = http.StatusOK sqlResponse.Message = "读取胜利" sqlResponse.Data = u c.JSON(http.StatusOK, sqlResponse)} func insertData(c *gin.Context) { var u SqlUser err := c.Bind(&u) if err != nil { sqlResponse.Code = http.StatusBadRequest sqlResponse.Message = "参数谬误" sqlResponse.Data = "error" c.JSON(http.StatusOK, sqlResponse) return } sqlStr := "insert into user(name, age, address) values (?,?,?)" ret, err := sqlDb.Exec(sqlStr, u.Name, u.Age, u.Address) if err != nil { fmt.Printf("insert failed, err:%v\n", err) sqlResponse.Code = http.StatusBadRequest sqlResponse.Message = "写入失败" sqlResponse.Data = "error" c.JSON(http.StatusOK, sqlResponse) return } sqlResponse.Code = http.StatusOK sqlResponse.Message = "写入胜利" sqlResponse.Data = "OK" c.JSON(http.StatusOK, sqlResponse) fmt.Println(ret.LastInsertId()) //打印后果 } //todo: go-sql-driver地址:https://github.com/go-sql-driver/mysql
2.xorm
xorm是一个简略而弱小的Go语言ORM库,通过它能够使数据库操作十分简便。
外围代码如下:
var x *xorm.Enginevar xormResponse XormResponse //定义构造体(xorm反对双向映射);没有表,会进行创立type Stu struct { Id int64 `xorm:"pk autoincr" json:"id"` //指定主键并自增 StuNum string `xorm:"unique" json:"stu_num"` Name string `json:"name"` Age int `json:"age"` Created time.Time `xorm:"created" json:"created"` Updated time.Time `xorm:"updated" json:"updated"`} //应答体type XormResponse struct { Code int `json:"code"` Message string `json:"msg"` Data interface{} `json:"data"`} func init() { sqlStr := "root:123456@tcp(127.0.0.1:3306)/xorm?charset=utf8&parseTime=true&loc=Local" //xorm代表数据库名称 var err error x, err = xorm.NewEngine("mysql", sqlStr) //1、创立数据库引擎 if err != nil { fmt.Println("数据库连贯失败:", err) } //2、创立或者同步表(名称为Stu) err = x.Sync(new(Stu)) if err != nil { fmt.Println("数据表同步失败:", err) }}func main() { r := gin.Default() //数据库的CRUD--->gin的 post、get、put、delete办法 r.POST("xorm/insert", xormInsetData) //增加数据 r.GET("xorm/get", xormGetData) //查问数据(单条记录) r.GET("xorm/mulget", xormGetMulData) //查问数据(多条记录) r.PUT("xorm/update", xormUpdateData) //更新数据 r.DELETE("xorm/delete", xormDeleteData) //删除数据 r.Run(":9090")} func xormGetData(c *gin.Context) { stuNum := c.Query("stu_num") var stus []Stu err := x.Where("stu_num=?", stuNum).Find(&stus) if err != nil { xormResponse.Code = http.StatusBadRequest xormResponse.Message = "查问谬误" xormResponse.Data = "error" c.JSON(http.StatusOK, xormResponse) return } xormResponse.Code = http.StatusOK xormResponse.Message = "读取胜利" xormResponse.Data = stus c.JSON(http.StatusOK, xormResponse)} func xormInsetData(c *gin.Context) { var s Stu err := c.Bind(&s) if err != nil { xormResponse.Code = http.StatusBadRequest xormResponse.Message = "参数谬误" xormResponse.Data = "error" c.JSON(http.StatusOK, xormResponse) return } affected, err := x.Insert(s) if err != nil || affected <= 0 { fmt.Printf("insert failed, err:%v\n", err) xormResponse.Code = http.StatusBadRequest xormResponse.Message = "写入失败" xormResponse.Data = err c.JSON(http.StatusOK, xormResponse) return } xormResponse.Code = http.StatusOK xormResponse.Message = "写入胜利" xormResponse.Data = "OK" c.JSON(http.StatusOK, xormResponse) fmt.Println(affected) //打印后果 } //TODO: xom文档地址:https://github.com/go-xorm/xorm
3.gorm
特地留神:gorm原来的版本曾经废除,新版本进行了迁徙,地址:https://gorm.io/。新版本与旧版本有很大的区别,本节次要解说新版本。
外围代码如下:
//特地留神:构造体名称为:Product,创立的表的名称为:Productstype Product struct { ID int `gorm:"primaryKey;autoIncrement" json:"id"` Number string `gorm:"unique" json:"number"` //商品编号(惟一) Category string `gorm:"type:varchar(256);not null" json:"category"` //商品类别 Name string `gorm:"type:varchar(20);not null" json:"name"` //商品名称 MadeIn string `gorm:"type:varchar(128);not null" json:"made_in"` //生产地 ProductionTime time.Time `json:"production_time"` //生产工夫} //应答体type GormResponse struct { Code int `json:"code"` Message string `json:"msg"` Data interface{} `json:"data"`} var gormDB *gorm.DBvar gormResponse GormResponse func init() { var err error sqlStr := "root:123456@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=true&loc=Local" gormDB, err = gorm.Open(mysql.Open(sqlStr), &gorm.Config{}) //配置项中预设了连接池 ConnPool if err != nil { fmt.Println("数据库连贯呈现了问题:", err) return } } func main() { r := gin.Default() //数据库的CRUD--->gin的 post、get、put、delete办法 r.POST("gorm/insert", gormInsertData) //增加数据 r.GET("gorm/get", gormGetData) //查问数据(单条记录) r.GET("gorm/mulget", gormGetMulData) //查问数据(多条记录) r.PUT("gorm/update", gormUpdateData) //更新数据 r.DELETE("gorm/delete", gormDeleteData) //删除数据 r.Run(":9090")}func gormGetData(c *gin.Context) { //=============捕捉异样============ defer func() { err := recover() if err != nil { gormResponse.Code = http.StatusBadRequest gormResponse.Message = "谬误" gormResponse.Data = err c.JSON(http.StatusBadRequest, gormResponse) } }() //============ number := c.Query("number") product := Product{} tx := gormDB.Where("number=?", number).First(&product) if tx.Error != nil { gormResponse.Code = http.StatusBadRequest gormResponse.Message = "查问谬误" gormResponse.Data = tx.Error c.JSON(http.StatusOK, gormResponse) return } gormResponse.Code = http.StatusOK gormResponse.Message = "读取胜利" gormResponse.Data = product c.JSON(http.StatusOK, gormResponse)} func gormInsertData(c *gin.Context) { //=============捕捉异样============ defer func() { err := recover() if err != nil { gormResponse.Code = http.StatusBadRequest gormResponse.Message = "谬误" gormResponse.Data = err c.JSON(http.StatusBadRequest, gormResponse) } }() //============ var p Product err := c.Bind(&p) if err != nil { gormResponse.Code = http.StatusBadRequest gormResponse.Message = "参数谬误" gormResponse.Data = err c.JSON(http.StatusOK, gormResponse) return } fmt.Println(p) tx := gormDB.Create(&p) if tx.RowsAffected > 0 { gormResponse.Code = http.StatusOK gormResponse.Message = "写入胜利" gormResponse.Data = "OK" c.JSON(http.StatusOK, gormResponse) return } fmt.Printf("insert failed, err:%v\n", err) gormResponse.Code = http.StatusBadRequest gormResponse.Message = "写入失败" gormResponse.Data = tx c.JSON(http.StatusOK, gormResponse) fmt.Println(tx) //打印后果} //Todo:GitHub地址:https://github.com/go-gorm/gorm//文档地址:https://gorm.io/