GO web 开发 实战二,数据库相关

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: xdm 上次有分享到GO web 开发 中 http 包中的简单方法使用,最后还有一个 模板 , 在这里补充一下

xdm 上次有分享到GO web 开发 中 http 包中的简单方法使用,最后还有一个 模板 , 在这里补充一下

直接上案例

模板

  • 我们在 **main.go ** 里面写一个 服务端的 demo,使用模板来将冬天的数据写入到 html 文件中
  • 对应的需要写一个 html 文件,并设置好 需要模板注入的数据位置

main.go

package main
import (
  "fmt"
  "html/template"
  "net/http"
)
var myTemp *template.Template
type Person struct {
  Name  string
  Title string
  Age   int
}
//开始处理数据和做响应
func userInfo(w http.ResponseWriter, req *http.Request) {
  defer req.Body.Close()
  var pp []Person
    // 简单模拟数据
  p1 := Person{
    Name:  "xmt 1号",
    Title: "1 号 展示台",
    Age:   18,
  }
  p2 := Person{
    Name:  "xmt 2号",
    Title: "2 号 展示台",
    Age:   15,
  }
  p3 := Person{
    Name:  "xmt 3号",
    Title: "3 号 展示台",
    Age:   29,
  }
  pp = append(pp, p1, p2, p3)
    // 将数据写到模板中
  err := myTemp.Execute(w, pp)
  if err != nil {
    fmt.Println("Execute err ;%v", err)
    return
  }
}
func main() {
  //初始化模板
  var err error
  myTemp, err = template.ParseFiles("./index.html")
  if err != nil {
    fmt.Println("ParseFiles err ;%v", err)
    return
  }
  //注册处理模板的函数  并 开启监听
  http.HandleFunc("/", userInfo)
  err = http.ListenAndServe("0.0.0.0:9999", nil)
  if err != nil {
    fmt.Println("ListenAndServe err ;%v", err)
    return
  }
}


index.html

<html>
    <head>
    </head>
    <body>
        <p>hello world</p>
        <table border="1" align="center" width="600px">
            <tr>
                <td>{{.Name}}</td> <td>{{.Age}}</td><td>{{.Title}}</td>
            </tr>
        </table>
    </body>
</html>


上述代码也比较简单,直接运行 main.go 就可以启动服务端,咱们只需要在浏览器中访问

http://localhost:8888/

即可看到咱们 html 展示的效果,数据是动态的

另外,接下来一起来看看 go web 中使用的 mysql 数据库

Mysql

连接数据库

操作数据库,基本是如下几个步骤

  • 先 open,再 ping , 必须要 ping 通了之后才可以算是连接上了MySQL数据库
  • 写 mysql 的代码,必须引入这个包   _ "github.com/go-sql-driver/mysql" , 需要先执行 mysql 中的 init 函数
  • 此处记得填写对自己 mysql 的密码,如果觉得密码不好记,可以设置密码为 123456 ,用于学习和实践

package main
import (
  "database/sql"
  "fmt"
  _ "github.com/go-sql-driver/mysql" // 注释掉后异常 _ 调用初始化函数
)
func main() {
  //打开mysql 数据库 进行连接 , 必须要 ping 通 才算是连接上 mysql 数据库
  db, err := sql.Open("mysql", "root:xxxxxx@tcp(127.0.0.1:3306)/go_test?charset=utf8mb4")
  if err != nil {
    fmt.Println("Open err : ", err)
    return
  }
  err = db.Ping()
  if err != nil {
    fmt.Println("Ping err : ", err)
    return
  }
  db.Close()
}

此处我们可以看到 charset=utf8mb4 ,这里是设置字符编码格式为  utf8mb4 ,主要是用于

这里需要说一下,基本上我们现在的 mysql 编码设置都是设置成 utf8mb4字符集 ,因为它支持 4 个字节的 Unicode 字符

在早期 Unicode 还不够完善的时候,是使用的 UTF8 ,只需要最长 3 个字节就可以表示  Unicode 字符

增加

做数据增加操作,向数据库中插入数据

  • 此处咱们使用 占位符的方式来插入数据
  • sqlInfo 变量里面填写 标准的 sql 语句即可
func insertPiceInfo(db *sql.DB) {
  // ? 作为占位符号
  sqlInfo := "insert into user(name,age)values(?,?)"
  ret, err := db.Exec(sqlInfo, "xxx", 19)
  if err != nil {
    fmt.Println("Exec err : ", err)
    return
  }
  //插入数据的id
  id, err := ret.LastInsertId()
  if err != nil {
    fmt.Println("LastInsertId err : ", err)
    return
  }
  fmt.Println("LastInsertId == ", id)
  //本次操作影响的行数
  rows, err := ret.RowsAffected()
  if err != nil {
    fmt.Println("RowsAffected err : ", err)
    return
  }
  fmt.Println("rows == ", rows)
}

执行插入语句后,可以通过插入的结果,来获取插入数据成功的 id 和本次插入数据影响的行数

删除

删除数据就比较简单,同样的我们可以拿到删除数据的结果,来获取对应影响的行数等等

func deletePiceInfo(db *sql.DB) {
  // ? 作为占位符号
  sqlInfo := "delete from user where id=  xx "
  ret, err := db.Exec(sqlInfo)
  if err != nil {
    fmt.Println("Exec err : ", err)
    return
  }
  //本次操作影响的行数
  rows, err := ret.RowsAffected()
  if err != nil {
    fmt.Println("RowsAffected err : ", err)
    return
  }
  fmt.Println("rows == ", rows)
}

修改

func updatePiceInfo(db *sql.DB) {
  // ? 作为占位符号
  sqlInfo := "update user set name='xxx' where id=xx"
  ret, err := db.Exec(sqlInfo)
  if err != nil {
    fmt.Println("Exec err : ", err)
    return
  }
  //本次操作影响的行数
  rows, err := ret.RowsAffected()
  if err != nil {
    fmt.Println("RowsAffected err : ", err)
    return
  }
  fmt.Println("rows == ", rows)
}

看,修改操作和其他增加,删除操作类似,写法基本上差不多,还比较简单

查询

查询操作的话,应该是数据库操作里面用的相对更多的操作了 , go 操作 mysql 查询的话,简单的 有 2 个注意点:

  • Query 之后的 得到的 rows 需要记得 close
  • 调用查询数据之后,需要记得马上调用 Scan 方法否则持有的数据库链接不会被释放
type myInfo struct{
  id int
  name string
  age int
}
func selectInfo(db *sql.DB) {
  sqlInfo := "select * from user"
  rows, err := db.Query(sqlInfo)
  if err != nil {
    fmt.Println("Exec err : ", err)
    return
  }
    // 非常重要:关闭 rows 释放持有的数据库链接
  defer rows.Close()
  //输出查询出来的行数
  for rows.Next(){
    var u myInfo
    rows.Scan(&u.id,&u.name,&u.age)
    fmt.Printf("id = %d, name = %s, age = %d\n",u.id,u.name,u.age)
  }
}

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
人工智能 前端开发 API
开源一周即飙升7.9K Star!Money Printer:一款可以自动创建带有配乐及字幕的短视频工具!
开源一周即飙升7.9K Star!Money Printer:一款可以自动创建带有配乐及字幕的短视频工具!
406 1
|
存储 运维 数据可视化
【技术分析】低代码平台的专有存储技术
低代码是一个新兴的技术,有着非常明确而鲜明的技术特点,比如:拖拽组件、可视化编程、零代码编程等等。但传统软件企业在进行技术融合时却往往是困难重重,旧有的技术积累很难能继承应用过来。本文作为一组技术分析,来逐一分解低代码背后的支撑技术。今天我们给大家带来的一个专题分析是,低代码平台的专有存储技术。
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】
|
数据安全/隐私保护
阿里云商标注册流程
很多用户有注册商标的需求,又不知道怎么注册商标。特别是他们想在阿里云注册商标,其实注册商标很简单。商标类型,又分为:文字商标,图形商标,文字图形组合商标。无论你在阿里云是要买域名,买服务器,还是干嘛,首先你都需要注册阿里云账号的。
|
运维 网络协议 Linux
2023年河南省中等职业教育技能大赛网络建设与运维项目比赛试题(一)
2023年河南省中等职业教育技能大赛网络建设与运维项目比赛试题(一)
|
机器学习/深度学习 存储 数据挖掘
基于YOLOv8深度学习的智能玉米害虫检测识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
基于YOLOv8深度学习的智能玉米害虫检测识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
|
存储 前端开发 JavaScript
使用JavaScript实现复杂功能——一个交互式音乐播放器
使用JavaScript实现复杂功能——一个交互式音乐播放器
|
安全 Android开发 开发者
安卓手机系统的优势和劣势分析
【2月更文挑战第8天】 安卓(Android)是目前全球最流行的移动操作系统之一,拥有强大的开源技术和丰富的应用生态系统。本文将从多个维度对安卓系统进行分析,并探讨其优势和劣势。
1412 2
|
移动开发 API
阿里云域名优惠口令_域名(Domain)-阿里云帮助中心
com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,cn域名注册优惠口令“互联网上的中国标识”,阿里云优惠口令是域名专属的优惠码,可用于域名注册、续费和转入使用,域名优惠口令区分域名后缀
560 1
|
弹性计算 Ubuntu Linux
2024年阿里云上幻兽帕鲁/Palworld游戏服务器简易部署教程
近期,作为一款主打多人游戏模式的全新开放世界生存制作游戏——《幻兽帕鲁》(Palworld) ,可谓“高效出圈”,自 2024 年 1 月 19 日在 Steam 平台发售抢先试玩版后,短短两个星期,幻兽帕鲁 steam 在线峰值已突破 200 万,跻身 Steam 历史第二高游戏!也因此,这款游戏获得了 2024 游戏界”新黑马“的称号。 目前对于《幻兽帕鲁》而言,面对此开年火爆的程度,游戏官方服务器接连出现了卡断/闪退/延迟高的状况,相关话题也在持续发酵,十分影响游戏体验,因此官方直接放出了幻兽帕鲁的服务器端,支持并鼓励各位玩家“自建帕鲁专用服务器”(Dedicated Server)。