内容简介:golang可以使用gorm工具对数据库进行操作,实现对数据的一系列操作.主要实现的功能如下:上述功能可以满足我们的日常开发需求.
golang : gorm + gin实现restful 接口
gorm操作数据库
golang可以使用gorm工具对数据库进行操作,实现对数据的一系列操作.
gorm的中文文档如下:
https://jasperxu.github.io/gorm-zh/主要实现的功能如下:
全功能ORM(几乎) 关联(包含一个,包含多个,属于,多对多,多种包含) Callbacks(创建/保存/更新/删除/查找之前/之后) 预加载(急加载) 事务 复合主键 SQL Builder 自动迁移 日志 可扩展,编写基于GORM回调的插件 每个功能都有测试 开发人员友好
上述功能可以满足我们的日常开发需求.
安装gorm
可以使用go get的方式直接安装
go get -u github.com/jinzhu/gorm
连接 mysql 并创建数据表
连接mysql数据库
var db *gorm.DB var err error func main() { db, err = gorm.Open("mysql", "用户名:密码@/go_test?charset=utf8&parseTime=True&loc=Local") if err != nil { panic(err) } defer db.Close() }
创建数据表
type User struct { gorm.Model Birthday time.Time Age int Name string `gorm:"size:255"` // string默认长度为255, 使用这种tag重设。 Num int `gorm:"AUTO_INCREMENT"` // 自增 Sex string `gorm:"size:"` CreditCard CreditCard // One-To-One (拥有一个 - CreditCard表的UserID作外键) Emails []Email // One-To-Many (拥有多个 - Email表的UserID作外键) BillingAddress Address // One-To-One (属于 - 本表的BillingAddressID作外键) BillingAddressID sql.NullInt64 ShippingAddress Address // One-To-One (属于 - 本表的ShippingAddressID作外键) ShippingAddressID int IgnoreMe int `gorm:"-"` // 忽略这个字段 Languages []Language `gorm:"many2many:user_languages;"` // Many-To-Many , 'user_languages'是连接表 } type Email struct { ID int UserID int `gorm:"index"` // 外键 (属于), tag `index`是为该列创建索引 Email string `gorm:"type:varchar(100);unique_index"` // `type`设置 sql 类型, `unique_index` 为该列设置唯一索引 Subscribed bool } type Address struct { ID int Address1 string `gorm:"not null;unique"` // 设置字段为非空并唯一 Address2 string `gorm:"type:varchar(100);unique"` Post sql.NullString `gorm:"not null"` } type Language struct { ID int Name string `gorm:"index:idx_name_code"` // 创建索引并命名,如果找到其他相同名称的索引则创建组合索引 Code string `gorm:"index:idx_name_code"` // `unique_index` also works } type CreditCard struct { gorm.Model UserID uint Number string }
CreditCard和User结构体中包含了gorm.Model,这是一个基础的结构体,包含了id,创建时间,修改时间和删除时间等基本信息字段:
type Model struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time `sql:"index"` }
如果想要在指定的数据库中创建上述表,执行如下操作:
db.AutoMigrate( &User{}, &Email{}, &Address{}, &Language{}, &CreditCard{})
针对数据的增加,查找,修改和删除操作,在下节配合http命令进行操作.
gin实现restful接口
gin是 go 一个性能不错的web框架,项目的github地址如下:
https://github.com/gin-gonic/gin安装gin
可以使用go get安装:
go get -u github.com/gin-gonic/gin
官方给出了一个简单的示例,可以快速的启动服务:
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run(":10080") // listen and serve on 0.0.0.0:10080 }
如果在本机启动该服务,浏览器访问 http://127.0.0.1:10080/ping 地址,可以看到获取到一个json块:
{"message": "pong"}
除了GET操作之外,其他的HTTP操作POST,PUT,DELETE也可以很方便的使用.
下面可以配合gorm实现gin的restful接口
首先定义好router以及相关路由策略:
router := gin.Default() router.GET("/user/", getUsers) router.GET("/user/:id", getOneUser) router.POST("/user", createUser) router.PUT("/user/:id", updateUser) router.DELETE("/user/:id", deleteUser)
每个路由都对应一个具体的函数操作,从而实现了对user的增,删,改,查操作.
func getUsers(c *gin.Context) { users := make([]User, 0) //db.Find(&users) db.Scopes(AgeGreaterThan20).Find(&users) c.JSON(http.StatusOK, gin.H{ "data": users, }) } func getOneUser(c *gin.Context) { id := c.Param("id") var user User if err := db.Where("id = ?", id).First(&user).Error; err != nil { c.AbortWithStatus(http.StatusNotFound) fmt.Println(err) } else { c.JSON(http.StatusOK, gin.H{ "data": user, }) } } func createUser(c *gin.Context) { var user User c.BindJSON(&user) user.Birthday = time.Now() db.Create(&user) c.JSON(http.StatusOK, gin.H{ "data": user, }) } func updateUser(c *gin.Context) { id := c.Param("id") var user User if err := db.Where("id = ?", id).First(&user).Error; err != nil { c.AbortWithStatus(http.StatusNotFound) fmt.Println(err) } else { c.BindJSON(&user) db.Save(&user) c.JSON(http.StatusOK, gin.H{ "data": user, }) } } func deleteUser(c *gin.Context) { id := c.Param("id") var user User db.Where("id = ?", id).Delete(&user) c.JSON(http.StatusOK, gin.H{ "data": "this has been deleted!", }) }
启动gin服务可以看到如下信息:
[GIN-debug] GET /user/ --> main.getUsers (3 handlers) [GIN-debug] GET /user/:id --> main.getOneUser (3 handlers) [GIN-debug] POST /user --> main.createUser (3 handlers) [GIN-debug] PUT /user/:id --> main.updateUser (3 handlers) [GIN-debug] DELETE /user/:id --> main.deleteUser (3 handlers) [GIN-debug] Listening and serving HTTP on :10080
如果要对上述接口进行测试可以使用postman等工具.经测试可以实现对user的增,删,改,查操作.
小结
通过非常简短的代码,就可以实现功能强大的restful接口,go语言的优势也是非常明显的.关于gin和gorm还有更加深入的内容.掌握好这两个 工具 可以轻松的构建web应用.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- delphi – 如何检查接口对象是否实现了另一个接口?
- SpringBoot2 API接口签名实现(接口参数防篡改)
- 接口与实现分离
- 判断Golang接口是否实现
- Python实现数据驱动接口测试
- Spring应用--实现InitializingBean接口
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Iterative Methods for Sparse Linear Systems, Second Edition
Yousef Saad / Society for Industrial and Applied Mathematics / 2003-04-30 / USD 102.00
Tremendous progress has been made in the scientific and engineering disciplines regarding the use of iterative methods for linear systems. The size and complexity of linear and nonlinear systems arisi......一起来看看 《Iterative Methods for Sparse Linear Systems, Second Edition》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
HTML 编码/解码
HTML 编码/解码