go gin学习记录5

有了前面几节的学习,如果做个简单的web服务端已经可以完成了。
这节来做一下优化。

我们实验了3种SQL写入的方法,但是发现每一种都需要在方法中去做数据库链接的操作,有些重复了。
所以,我们把这部分提取出来,数据库链接的功能提取出来,数据库的配置也提取出来。
这就是今天这节要做的内容,配置化。

配置文件通常是放在conf目录下,所以我们在t_gin/下新建一个conf目录,用来存放配置文件。
然后在conf目录下,新建一个service.conf文件,作为实验用的配置文件。
完成后的目录结果如下:
在这里插入图片描述
配置文件这里使用.ini的格式。
要解析.ini格式,我们需要下载对应的package:

$ go get gopkg.in/ini.v1

将package安装好之后,我们再来想一下配置文件里放什么。
首先,我们可以将数据库配置放进去,简单点的就是dsn,这个在多场景都会用到,就不用在每个文件中去重复定义了。
在service.conf中添加数据库配置:

[mysql]
dsn = "root:@tcp(127.0.0.1:3306)/t_gin?charset=utf8&parseTime=true"

配置添加好了,怎么用呢?
方便一点,就继续使用上一节的worker.go文件来进行改造。
要做的是:
1.将数据库链接操作提取出来,不用每个方法都写一遍;
2.将dsn配置改为从配置文件service.conf中获取,不用每个文件都写一遍。
开始撸码:

func (w *WorkerController) init() *sql.DB {
	cfg, err := ini.Load("conf/service.conf")
	if err != nil {
		log.Println(err.Error())
	}
	mysqlDsn := cfg.Section("mysql").Key("dsn").String()
	db, err := sql.Open("mysql", mysqlDsn)
	if err != nil {
		log.Panic(err.Error())
	}
	return db
}

init方法是我们的简单实现。
从service.conf中读取了dsn信息,然后建立数据库链接,并返回链接。
那方法提取出来了,文件中之前的代码(插入、查询、更新)我们也同步进行调整。
调整之后的worker.go文件内容如下:

package controller

import (
	"database/sql"
	"github.com/gin-gonic/gin"
	"github.com/huandu/go-sqlbuilder"
	"gopkg.in/ini.v1"
	"log"
	"net/http"
)

type WorkerController struct {
}

type Worker struct {
	ID    int    `json:"id"`
	Name  string `json:"name"`
	Birth string `json:"birth"`
}

func (w *WorkerController) init() *sql.DB {
	cfg, err := ini.Load("conf/service.conf")
	if err != nil {
		log.Println(err.Error())
	}
	mysqlDsn := cfg.Section("mysql").Key("dsn").String()
	db, err := sql.Open("mysql", mysqlDsn)
	if err != nil {
		log.Panic(err.Error())
	}
	return db
}

func (w *WorkerController) CreateWorker(c *gin.Context) {
	db := w.init()
	name := c.PostForm("name")
	birth := c.PostForm("birth")

	sb := sqlbuilder.NewInsertBuilder()
	sb.InsertInto("worker")
	sb.Cols("name", "birth")
	sb.Values(name, birth)

	sqlString, args := sb.Build()
	log.Println(sqlString, args)

	_, err := db.Exec(sqlString, args...)
	if err != nil {
		log.Panic(err.Error())
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"data": true,
	})
}

func (w *WorkerController) GetWorkerInfo(c *gin.Context) {
	db := w.init()
	id := c.Query("id")

	sb := sqlbuilder.NewSelectBuilder()
	sb.From("worker")
	sb.Select("id,name,birth")
	sb.Where(sb.Equal("id", id))

	sqlString, args := sb.Build()
	log.Println(sqlString, args)

	result := db.QueryRow(sqlString, args...)

	var worker Worker
	err := result.Scan(&worker.ID, &worker.Name, &worker.Birth)
	if err != nil {
		log.Panic(err.Error())
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"data": worker,
	})
}

func (w *WorkerController) UpdateWorkerInfo(c *gin.Context) {
	db := w.init()
	id := c.PostForm("id")
	name := c.PostForm("name")

	sb := sqlbuilder.NewUpdateBuilder()
	sb.Update("worker")
	sb.Where(sb.Equal("id", id))
	sb.SetMore(sb.Assign("name", name))

	sqlString, args := sb.Build()
	log.Println(sqlString, args)

	_, err := db.Exec(sqlString, args...)
	if err != nil {
		log.Panic(err.Error())
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"data": true,
	})
}

修改完之后,我们运行测试,对插入、获取、更新方法都进行测试后,确认代码功能正常。

在这里,简单的将mysql的dsn配置抽出到了配置文件中做了一个示例,同样的其它一些不常用的或者很常用的配置,都是可以放在配置文件中进行处理的,免去了项目中多处写,有利于配置管理。

今天这节就到这儿。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值