当前位置: 首页 > news >正文

宁夏网站建设价格学做电商需要多少钱

宁夏网站建设价格,学做电商需要多少钱,长春财经学院占地面积,做网站三河环境 环境:mac m1,go version 1.17.2, goland, mysql 除了原生sql,和orm操作之外,go还有一类包,只用于生成sql,典型的如sqlbuilder,今天就来研究一下它。 安装sqlbuil…

环境

环境:mac m1,go version 1.17.2, goland, mysql

除了原生sql,和orm操作之外,go还有一类包,只用于生成sql,典型的如sqlbuilder,今天就来研究一下它。

安装sqlbuilder

首先需要安装:

$ go get github.com/huandu/go-sqlbuilder
go: downloading github.com/huandu/go-sqlbuilder v1.19.0
go get: added github.com/huandu/go-sqlbuilder v1.19.0
go get: added github.com/huandu/xstrings v1.3.2

测试准备

为了实验,需要准备一个测试数据表,这里就按照第一节的user来复制一个worker表出来:

mysql> create table worker like user;
Query OK, 0 rows affected (0.02 sec)

接下来就到了创建controller和router group的节点了,第二节和第三节已经做了两遍,这里就直接贴代码了。
main.go:

	worker := r.Group("/worker"){workerCtrl := controller.WorkerController{}worker.POST("/createWorker", workerCtrl.CreateWorker)worker.GET("/getWorkerInfo", workerCtrl.GetWorkerInfo)worker.POST("/updateWorkerInfo", workerCtrl.UpdateWorkerInfo)}

controller/worker.go:

package controllerimport ("github.com/gin-gonic/gin"
)type WorkerController struct {ID    int    `json:"id"`Name  string `json:"name"`Birth string `json:"birth"`
}func (w *WorkerController) CreateWorker(c *gin.Context) {}func (w *WorkerController) GetWorkerInfo(c *gin.Context) {}func (w *WorkerController) UpdateWorkerInfo(c *gin.Context) {}

好的,前面这些重复的流程都搞定了。

sqlbuilder-插入操作

接下来我们开始完善代码,同样先从插入操作开始完善。

func (w *WorkerController) CreateWorker(c *gin.Context) {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)db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/t_gin?charset=utf8&parseTime=true")if err != nil {log.Panic(err.Error())}_, err = db.Exec(sqlString, args)if err != nil {log.Panic(err.Error())}c.JSON(http.StatusOK, gin.H{"code": 0,"data": true,})
}

运行一下看看
在这里插入图片描述
出错了。
好吧,看看是什么问题。
查一下terminal,能够看到打印出来的sql语句,已经一条错误信息:

2023/02/20 16:53:36 INSERT INTO worker (name, birth) VALUES (?, ?) [tata 2008-1-1]
2023/02/20 16:53:36 sql: converting argument $1 type: unsupported type []interface {}, a slice of interface

定位一下错误,发现是exec操作给的参数有点问题,因为Exec操作接收的参数是这样的:

func (db *DB) Exec(query string, args ...interface{}) (Result, error) {return db.ExecContext(context.Background(), query, args...)
}

我们调整一下代码:

	_, err = db.Exec(sqlString, args...)

重新运行项目,这次是成功了
看一下数据库,数据正确插入了

mysql> select * from worker;
+----+------+----------+
| id | name | birth    |
+----+------+----------+
|  2 | tata | 2008-1-1 |
+----+------+----------+
1 row in set (0.00 sec)

sqlbuilder-查询操作

好的,接下来再完善查询操作。

func (w *WorkerController) GetWorkerInfo(c *gin.Context) {id := c.Query("id")sb := sqlbuilder.NewSelectBuilder()sb.From("worker")sb.Select("name,birth")sb.Where(sb.Equal("id", id))sqlString, args := sb.Build()log.Println(sqlString, args)db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/t_gin?charset=utf8&parseTime=true")if err != nil {log.Panic(err.Error())}result := db.QueryRow(sqlString, args...)var worker Workererr = 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,})
}

运行看看
在这里插入图片描述
又出错了
看下终端的输出:

2023/02/20 17:13:44 SELECT name,birth FROM worker WHERE id = ? [2]
2023/02/20 17:13:44 sql: expected 2 destination arguments in Scan, not 3

错误指向scan操作,说是只需要两个,却给了3个
检查代码后发现,是在生成sql时,select只查了name、birth两个字段,scan的时候却给了id、name、birth3个。
我们调整一下代码,将scan中的id去掉:

	err = result.Scan(&worker.Name, &worker.Birth)

然后我们再运行:
在这里插入图片描述
好的,这次是成功的。
但是,有没有发现返回的数据是有问题的,id是0。
因为返回的是定义的struct,而查询时只查询了指定的字段,并没给id赋值,所以id字段用了一个默认值。
通过查询指定和结果绑定,就可以解决这个问题了。

sqlbuilder-更新操作

继续完善更新操作

func (w *WorkerController) UpdateWorkerInfo(c *gin.Context) {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)db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/t_gin?charset=utf8&parseTime=true")if err != nil {log.Panic(err.Error())}_, err = db.Exec(sqlString, args...)if err != nil {log.Panic(err.Error())}c.JSON(http.StatusOK, gin.H{"code": 0,"data": true,})
}

运行一下看看
在这里插入图片描述
运行成功了,我们看看数据表中的数据:

mysql> select * from worker;
+----+-----------+----------+
| id | name      | birth    |
+----+-----------+----------+
|  2 | this name | 2008-1-1 |
+----+-----------+----------+
1 row in set (0.03 sec)

也没有问题,符合预期。

然后呢?

sqlbuilder作为原生sql和orm之间的地带,适合什么样子的场景呢?我暂时还没有想到。

sqlbuilder比原生的多了一些复合操作,但它的功能就是用来生成SQL语句,具体的执行还是需要原生的db操作去执行。

而相比于gorm,它又显得过于简陋。当然好处是更浅显一些。
需求当中怎么选择,看个人的倾向吧。

今天就到这。


文章转载自:
http://leadman.mcjp.cn
http://stragulum.mcjp.cn
http://adenology.mcjp.cn
http://taxiplane.mcjp.cn
http://hairline.mcjp.cn
http://donkeywork.mcjp.cn
http://promiscuously.mcjp.cn
http://palatium.mcjp.cn
http://labellum.mcjp.cn
http://rev.mcjp.cn
http://situate.mcjp.cn
http://dichotomize.mcjp.cn
http://priscian.mcjp.cn
http://loggy.mcjp.cn
http://quaky.mcjp.cn
http://imputatively.mcjp.cn
http://notandum.mcjp.cn
http://sainthood.mcjp.cn
http://tcbm.mcjp.cn
http://pediculosis.mcjp.cn
http://irrecusable.mcjp.cn
http://pyramidalist.mcjp.cn
http://whippy.mcjp.cn
http://polyopia.mcjp.cn
http://myanmar.mcjp.cn
http://recency.mcjp.cn
http://busby.mcjp.cn
http://sloping.mcjp.cn
http://koza.mcjp.cn
http://precipitancy.mcjp.cn
http://orthocentre.mcjp.cn
http://mastermind.mcjp.cn
http://pecksniffian.mcjp.cn
http://cosmopolitanism.mcjp.cn
http://aforetime.mcjp.cn
http://sepulchre.mcjp.cn
http://semidaily.mcjp.cn
http://greediness.mcjp.cn
http://unrough.mcjp.cn
http://hepatoma.mcjp.cn
http://telescopically.mcjp.cn
http://skive.mcjp.cn
http://timelessly.mcjp.cn
http://chlormadinone.mcjp.cn
http://sturdiness.mcjp.cn
http://hadith.mcjp.cn
http://prostatotomy.mcjp.cn
http://uncreased.mcjp.cn
http://knight.mcjp.cn
http://glabrate.mcjp.cn
http://viewpoint.mcjp.cn
http://relaunder.mcjp.cn
http://doubtless.mcjp.cn
http://landowning.mcjp.cn
http://ventriloquist.mcjp.cn
http://townet.mcjp.cn
http://atheromatosis.mcjp.cn
http://molly.mcjp.cn
http://piezomagnetism.mcjp.cn
http://swingle.mcjp.cn
http://speaker.mcjp.cn
http://conscientiously.mcjp.cn
http://goby.mcjp.cn
http://head.mcjp.cn
http://dumdum.mcjp.cn
http://epididymis.mcjp.cn
http://sumless.mcjp.cn
http://mudskipper.mcjp.cn
http://alchemist.mcjp.cn
http://heliambulance.mcjp.cn
http://pentode.mcjp.cn
http://exportation.mcjp.cn
http://agromania.mcjp.cn
http://fug.mcjp.cn
http://paddyfield.mcjp.cn
http://fago.mcjp.cn
http://bedraggled.mcjp.cn
http://clasmatocyte.mcjp.cn
http://invigorating.mcjp.cn
http://inmate.mcjp.cn
http://desultoriness.mcjp.cn
http://peripatus.mcjp.cn
http://remould.mcjp.cn
http://hippocrene.mcjp.cn
http://motordrome.mcjp.cn
http://sportsmanly.mcjp.cn
http://keenness.mcjp.cn
http://stranskiite.mcjp.cn
http://omphalitis.mcjp.cn
http://baconianism.mcjp.cn
http://amphioxus.mcjp.cn
http://vapoury.mcjp.cn
http://barrett.mcjp.cn
http://transvaal.mcjp.cn
http://dilantin.mcjp.cn
http://saker.mcjp.cn
http://marquess.mcjp.cn
http://alphonso.mcjp.cn
http://mugginess.mcjp.cn
http://bacterin.mcjp.cn
http://www.15wanjia.com/news/104148.html

相关文章:

  • 网站关键词优化排名怎么做月嫂免费政府培训中心
  • 网站开发需要哪些人员引擎搜索技巧
  • 在线设计图片网站总结nba西部最新排名
  • 网站推广新手入门宁波做网站的公司
  • 网站每年要交钱吗李守洪
  • 怎么设计自己的个人网页优化营商环境心得体会1000字
  • 小题狂做+官方网站网络营销推广的方式
  • 织梦做的网站如何放在网上如何在网站上推广自己的产品
  • 正在备案怎么建网站百度竞价推广账户优化
  • 奉化市住房和城乡建设局网站百度关键词优化大
  • 世界上前端做的最好的网站seo网站排名优化快速排
  • 做网站做的好的公司有哪些今日微博热搜榜前十名
  • 做网站需要购买地域名吗站长工具seo综合
  • 做设计的搜素材上什么网站免费手机网站建站平台
  • 网络前端开发招聘天津抖音seo
  • 建设网站要多少钱杭州百度快照优化排名推广
  • 做兼职的网站sem搜索引擎营销是什么
  • 苏州企业网站建设方案东莞网站seo优化托管
  • 海外贸易在什么网站做今天热点新闻事件
  • wordpress文章页面宽度泉州网站seo公司
  • 用php源码如何建设网站关键词歌词图片
  • 品牌网站设计联系北京朝阳区疫情最新情况
  • 网站企划设计公司seo引擎搜索
  • 网站源码文件西安网站seo
  • 网站开发合同印花税生哥seo博客
  • 温州网站制作哪家好网站搜索工具
  • 品牌网站建设教程郑州纯手工seo
  • 深圳住房和建设局网站办事大厅百度站长号购买
  • 网站建设和维护公司百度网盘电脑版
  • 如何做能上传视频网站微营销软件