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)
}
}
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~
相关文章
- 2.Go语言项目操作MySQL数据库实践
- 2022-08-21:以下go语言代码输出什么?A:0;B:panic;C:不知道。package mainvar n = -9
- 2022-09-06:以下go语言代码输出什么?A:Hi All;B:Hi go All;C:Hi;D:go All。packa
- 单细胞各个亚群特异性高表达基因的数据库注释(包括GO,KEGG,ReactomePA)
- Go-标准库-runtime(三)
- Go-包管理-go get(二)
- Go-包管理-go mod(一)
- Go-包管理-go clean
- Go-数据库操作(一)
- Go-数据库操作(三)
- Go-数据库操作(五)
- 精通Go语言开发Redis应用(go语言redis开发)
- 数据库构建Web与MySQL数据库之间的连接(web连接mysql)
- 简易教程:如何在 Linux 上安装 GO 语言(go语言安装linux)
- 以Go语言操作MySQL:轻松运行数据库各种查询(go语言mysql)
- 键入高效数据库搜索:深入解析Go和MongoDB的强大组合(gomongodb)
- 面向Web的MS SQL数据库技术(web mssql)
- 如何在Linux上安装Go语言?——简单易懂的指南(linux安装go语言)
- MSSQL Web管理工具简介:轻松管理数据库的利器(mssql web 管理)
- Go语言查询Oracle数据库实战实例(go语言查询oracle)
- Go语言操作Oracle轻松实现数据库编程(go语言访问oracle)
- 新技术Go语言解析Oracle数据库日志(go解析oracle日志)
- 程序Go语言调用Oracle数据库驱动程序指南(go oracle驱动)
- 征程开启学习使用Oracle数据库(go oracle数据库)
- Web端登录Redis提高数据库性能(web登录redis作用)
- 红遍大街小巷,去用Redis吧(to go redis)
- 学习Oracle Go了解信息技术世界(oracle go的用法)