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

2023-01-27  本文已影响0人  阿兵云原生

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

直接上案例

模板

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

连接数据库

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

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

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

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

增加

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

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 个注意点:

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

好了,本次就到这里

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

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

上一篇 下一篇

猜你喜欢

热点阅读