models.go
============================
package main
import (
"github.com/astaxie/beego/orm"
)
type User struct {
Id int
Name string
Profile *Profile +orm:"rel(one)"+ // OneToOne relation
}
type Profile struct {
Id int
User *User +orm:"reverse(one)"+ // 设置反向关系(可选)
func init() {
// 需要在init中注册定义的model
orm.RegisterModel(new(User), new(Profile))
main.go
==============
"fmt"
_ "github.com/go-sql-driver/mysql"
//orm.RegisterModel(new(User))
orm.RunSyncdb("default", false, true) // true 改成false,如果表存在则会给出提示,如果改成false则不会提示 , 这句话没有会报主键不存在的错误
func main() {
o := orm.NewOrm()
o.Using("default") // 默认使用 default,你可以指定为其他数据库
user := User{Id: 1}
err := o.Read(user)
if err == orm.ErrNoRows {
fmt.Println("查询不到")
} else if err == orm.ErrMissPK {
fmt.Println("找不到主键")
} else {
fmt.Println(user.Id, user.Name)
执行结果:
create table +user+
-- --------------------------------------------------
-- Table Structure for +main.User+
CREATE TABLE IF NOT EXISTS +user+ (
+id+ integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
+profile_id+ integer NOT NULL UNIQUE
) ENGINE=InnoDB;
create table +profile+
-- Table Structure for +main.Profile+
CREATE TABLE IF NOT EXISTS +profile+ (
+age+ smallint NOT NULL
查询不到
第二次再执行:
table +user+ already exists, skip
table +profile+ already exists, skip
如果 orm.RunSyncdb("default", false, true)改成 orm.RunSyncdb("default", false, false)
则执行结果不会提示.
Revel Web开源框架
个高效的Go语言Web开发框架,?其思路完全来自 Java 的?Play Framework.
特点
热编译,简单可选,同步(每个请求都创建自己的goroutine来处理.
Go语言Web框架:beego
支持特性
MVC;
REST;
智能路由;
日志调试;
配置管理;
模板自动渲染;
layout设计;
中间件插入逻辑;
方便的JSON/XML服务;
①先安装Go对应的开源Swagger相关的库
go get?github.com/swaggo/swag/cmd/swag
go get github.com/swaggo/gin-swagger
go get?github.com/swaggo/files
go get?github.com/alecthomas/template
// @Summary 获取多个标签
// @Tags 标签
// @Produce? json
// @Param name query string false "标签名称" maxlength(100)
// @Param state query int false "状态" Enums(0, 1) default(1)
// @Param page query int false "页码"
// @Param page_size query int false "每页数量"
// @Router /api/v1/tags [get]
func (t Tag) List(c *gin.Context) {
// @Summary 新增标签
// @Param state body int false "状态" Enums(0, 1) default(1)
// @Router /api/v1/tags [post]
func (t Tag) Create(c *gin.Context) {
// @Summary 更新标签
// @Param id path int true "标签ID"
// @Param state body int false "状态 (0为未删除、1为已删除)" Enums(0, 1) default(1)
// @Router /api/v1/tags/{id} [put]
func (t Tag) Update(c *gin.Context) {
这时会在我项目的docs文件夹下面生成docs.go、swagger.json、swagger.yaml三个文件
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
同时要引用 _"blog-service/docs" ,不然会报错
何为框架:
框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了.成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应手的时候,可以尝试改造一些框架,或是自己创造一个.
Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本.具有快速灵活,容错方便等特点.其实对于golang而言,web框架的依赖要远比Python,Java之类的要小.自身的net/http足够简单,性能也非常不错.框架更像是一些常用函数或者工具的集合.借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范.
(1)首先需要安装,安装比较简单,使用go get即可
go get github.com/gin-gonic/gin
如果安装失败,直接去Github clone下来,放置到对应的目录即可.
下面是一个使用Gin的简单例子:
"github.com/gin-gonic/gin"
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
"message": "pong",
})
简单几行代码,就能实现一个web服务.使用gin的Default方法创建一个路由handler.然后通过HTTP方法绑定路由规则和路由函数.不同于net/http库的路由函数,gin进行了封装,把request和response都封装到gin.Context的上下文环境.最后是启动路由的Run方法监听端口.麻雀虽小,五脏俱全.当然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法.
Gin可以很方便的支持各种HTTP请求方法以及返回各种类型的数据,详情可以前往查看.
我们可以使用Gin框架快速的匹配参数,如下代码所示:
浏览器输入以下测试:
返回结果为:
其中c.String是gin.Context下提供的方法,用来返回字符串.
其中c.Json是gin.Context下提供的方法,用来返回Json.
下面我们使用以下gin提供的Group函数,方便的为不同的API进行分类.
注:Gin还包含更多的返回方法如c.String, c.HTML, c.XML等,请自行了解.可以方便的返回HTML数据
我们在之前的组v1路由下新定义一个路由:
下面我们访问
可以看到,通过c.Param("key")方法,Gin成功捕获了url请求路径中的参数.同理,gin也可以捕获常规参数,如下代码所示:
在浏览器输入以下代码:
通过c.Query("key")可以成功接收到url参数,c.DefaultQuery在参数不存在的情况下,会由其默认值代替.
我们还可以为Gin定义一些默认路由:
这时候,我们访问一个不存在的页面:
返回如下所示:
下面我们测试在Gin里面使用Post
在测试端输入:
附带发送的数据,测试即可.记住需要使用POST方法.
继续修改,将PostHandler的函数修改如下
测试工具输入:
发送的内容输入:
返回结果如下:
备注:此处需要指定Content-Type为application/x-www-form-urlencoded,否则识别不出来.
一定要选择对应的PUT或者DELETE方法.
Gin框架快速的创建路由
能够方便的创建分组
支持url正则表达式
支持参数查找(c.Param c.Query c.PostForm)
请求方法精准匹配
之前写过了Go语言gorm框架MySQL实践,其中对gorm框架在操作MySQL的各种基础实践,下面分享一下如何使用gorm框架对MySQL直接进行性能测试的简单实践.
这里我使用了一个原始的Go语言版本的 FunTester 测试框架,现在只有一个基本的方法,实在是因为Go语言特性太强了.框架设计的主要思路之一就是利用Go语言的闭包和方法参数特性,将一个 func() 当做性能测试的主题,通过不断运行这个 func() 来实现性能测试.当然还有另外一个思路就是运行一个多线程任务类,类似 Java 版本的 com.funtester.base.constaint.ThreadBase 抽象类,这样可以设置一些类的属性,绑定一些测试资源,适配更多的测试场景.
下面演示select的性能测试,这里我用了随机ID查询的场景.
这里使用了select的用例部分,随机ID,然后更新name字段,随机10个长度的字符串.
这里用到了 FunTester 字段都是随机生成.
到这里可以看出,性能测试框架用到的都是gorm框架的基础API使用,这里MySQL连接池的管理工作完全交给了gorm框架完成,看资料说非常牛逼,我们只需要设置几个参数.这个使用体现很像 HttpClient 设置 HTTP 连接池类似,这里我们也可以看出这些优秀的框架使用起来都是非常简单的.
PS:关于gorm的基础使用的请参考上一期的文章Go语言gorm框架MySQL实践.
本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识.
您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数.
在本教程中,您将创建一个数据库,然后编写代码来访问该数据库.您的示例项目将是有关老式爵士乐唱片的数据存储库.
首先,为您要编写的代码创建一个文件夹.
①.、打开命令提示符并切换到您的主目录.
在 Linux 或 Mac 上:
在 Windows 上:
运行go mod init命令,为其提供新代码的模块路径.
此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪.
注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径.有关更多信息,请参阅一下文章.
GO语言(二十五):管理依赖项(上)
GO语言(二十六):管理依赖项(中)
GO语言(二十七):管理依赖项(下)
此时此刻呢,您将创建一个数据库.
在此步骤中,您将创建要使用的数据库.您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据.
您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据.
这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能.
①.、打开一个新的命令提示符.
在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示.
将以下 SQL 代码粘贴到文件中,然后保存文件.
在此 SQL 代码中:
(1)删除名为album表. 首先执行此命令可以让您更轻松地稍后重新运行脚本.
您将使用以下形式的source命令:
此时此刻呢,您将编写一些 Go 代码进行连接,以便进行查询.
现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码.
找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求.
①.、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序.
在此代码中:
(1)将您的代码添加到main包中,以便您可以独立执行它.
导入驱动程序后,您将开始编写代码以访问数据库.
现在编写一些 Go 代码,让您使用数据库句柄访问数据库.
您将使用指向结构的指针sql.DB,它表示对特定数据库的访问.
编写代码
①.、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄.
该Config结构使代码比连接字符串更容易阅读.
为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台.在生产代码中,您会希望以更优雅的方式处理错误.
文件的顶部现在应该如下所示:
①.、开始跟踪 MySQL 驱动程序模块作为依赖项.
使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项.使用点参数表示"获取当前目录中代码的依赖项".
连接成功了!
此时此刻呢,您将查询一些数据.
以上就是土嘎嘎小编为大家整理的go语言数据库框架相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!