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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: GO web 开发 实战二,数据库相关

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)
  }
}

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
缓存 安全 API
深入理解Web开发中的RESTful API设计
在当今快速演进的技术世界中,RESTful API已成为构建现代Web应用不可或缺的一部分。它不仅促进了前后端的分离发展,还为不同平台间的数据交换提供了一种高效、标准化的方式。本文旨在深入探讨RESTful API的设计原则和最佳实践,通过具体示例说明如何设计易于维护、可扩展和安全的API。我们将从REST的基本概念出发,逐步深入到资源命名、HTTP方法的恰当使用、状态码的选择、以及安全性考虑等方面,为读者提供一个全面而深入的视角,帮助大家更好地理解和运用RESTful API。
|
13天前
|
Rust JavaScript 前端开发
深入探讨WebAssembly在现代Web开发中的应用
随着互联网技术的不断进步,传统的Web开发方法已经无法满足现代应用程序对性能和功能的高要求。WebAssembly(简称Wasm)作为一种新兴的技术,为解决这一问题提供了独特的视角和方法。本文将从WebAssembly的基本概念出发,详细探讨其在前端开发中的应用,包括与JavaScript的互操作性、在性能优化方面的优势,以及如何通过实例来实现复杂应用的性能提升。此外,文章还将探讨WebAssembly在未来Web开发中的潜在发展方向,旨在为开发者提供一种全新的视角,以更高效、更强大的方式构建Web应用。
|
16天前
|
Rust 前端开发 JavaScript
探索未来:WebAssembly与现代Web开发的融合
在当今快速发展的技术世界中,WebAssembly(简称Wasm)已经成为了一个颠覆性的技术,它不仅打破了传统前端开发的限制,还为高性能应用的实现提供了新的可能性。本文将深入探讨WebAssembly的核心概念、它如何与现有的Web技术栈相结合,以及通过实际案例分析其在现代Web开发中的应用。我们将从WebAssembly的基础出发,探讨其与JavaScript的互操作性,最后通过一个具体的应用示例,展示如何利用WebAssembly提升Web应用的性能和用户体验。本文旨在为前端开发人员提供一份指南,帮助他们理解并开始使用WebAssembly来构建下一代Web应用。
|
17天前
|
Rust JavaScript 前端开发
探索未来:WebAssembly与现代Web开发的融合
在本文中,我们将深入探讨WebAssembly(简称Wasm)技术及其如何彻底改变现代Web开发的面貌。不同于传统的摘要方式,我们将通过一个虚构的案例——“Zeta项目”——来展示Wasm的潜力和实际应用。Zeta项目是一个致力于将复杂的桌面级应用无缝迁移到网页上的创新尝试,它利用了Wasm的跨平台、高性能特性,为用户提供了前所未有的在线体验。通过这一案例,我们希望读者能够直观地理解Wasm技术的强大功能以及它对未来Web开发的影响。
|
18天前
|
前端开发 JavaScript Java
从前端到后端:探索Web开发的技术演进
本文将介绍Web开发领域中前端和后端技术的演进过程。我们将从最初的静态网页开始,逐步探索动态网页、前后端分离、服务器端渲染等技术,以及流行的编程语言如Java、Python和C的应用。通过了解这些技术的发展,读者可以更好地理解Web开发的现状以及未来的趋势。
|
18天前
|
编译器 Go 索引
go 开发入门篇之 go 语言
go 开发入门篇之 go 语言
|
19天前
|
前端开发 JavaScript Java
Web开发介绍
Web开发介绍
22 0
Web开发介绍
|
21天前
|
前端开发 JavaScript 测试技术
探讨前后端分离架构在Web应用开发中的优势与实践
本文将深入探讨前后端分离架构在Web应用开发中的优势与实践。通过明确前后端分离的定义和原理,分析其在提高开发效率、降低耦合性、增强可维护性等方面的优势。同时,为读者提供了一些实践指导,包括如何选择适合的前后端分离框架、如何合理划分前后端职责等,旨在帮助开发者更好地应用这一架构并取得良好的开发效果。
|
21天前
|
缓存 前端开发 JavaScript
现代Web开发中的前端技术趋势
本文探讨了现代Web开发中的前端技术趋势,包括响应式设计、单页面应用、前端框架选择、组件化开发和前端性能优化等方面。通过对这些趋势的分析和讨论,读者可以了解当前前端开发领域的最新动态,为自己的项目做出更明智的技术选择。
|
23天前
|
存储 关系型数据库 MySQL
由浅入深:数据库编程概念与实战
由浅入深:数据库编程概念与实战
13 0