在 Golang 网站中使用模板显示 mysql 表

Posted

技术标签:

【中文标题】在 Golang 网站中使用模板显示 mysql 表【英文标题】:Display mysql table using template in Golang website 【发布时间】:2022-01-21 09:53:30 【问题描述】:

我正在学习 GoLang Web 开发,我正在尝试在使用 Golang 模板呈现的网页上显示 mysql 数据库中的表的简单示例。 下面是我的代码的 sn-p,它不起作用。表格渲染失败,模板中的 range 函数不起作用

服务器.go

package main

import (
    "fmt"
    "net/http"
    _ "github.com/go-sql-driver/mysql"
    "database/sql"
    "os"
    "html/template"
)

type Employee struct 
    fname, sname, dname, email string


func helloWorld(w http.ResponseWriter, r *http.Request)
    name, err := os.Hostname()
    checkErr(err)
    fmt.Fprintf(w, "HOSTNAME : %s\n", name)


func dbConnect() (db *sql.DB) 
    dbDriver := "mysql"
    dbUser := "root"
    dbPass := "password"
    dbHost := "mysql.go"
    dbPort := "3306"
    dbName := "company"
    db, err := sql.Open(dbDriver, dbUser +":"+ dbPass +"@tcp("+ dbHost +":"+ dbPort +")/"+ dbName +"?charset=utf8")
    checkErr(err)
    return db


func dbSelect() []Employee
    db := dbConnect()
    rows, err := db.Query("select * from employees")
    checkErr(err)

    employee := Employee
    employees := []Employee

    for rows.Next() 
        var first_name, last_name, department, email string
        err = rows.Scan(&first_name, &last_name, &department, &email)
        checkErr(err)
        employee.fname = first_name
        employee.sname = last_name
        employee.dname = department
        employee.email = email
        employees = append(employees, employee)

    
    defer db.Close()
    return employees


var tmpl = template.Must(template.ParseFiles("layout.html"))
//var tmpl = template.Must(template.ParseGlob("layout.html"))
func dbTableHtml(w http.ResponseWriter, r *http.Request)
    table := dbSelect()
    tmpl.ExecuteTemplate(w, "Index", table)


func dbTable(w http.ResponseWriter, r *http.Request)
    table := dbSelect()
    for i := range(table) 
        emp := table[i]
        fmt.Fprintf(w,"YESS|%12s|%12s|%12s|%20s|\n" ,emp.fname ,emp.sname ,emp.dname ,emp.email)
    


func main() 
    http.HandleFunc("/", helloWorld)
    http.HandleFunc("/view", dbTableHtml) 
    http.HandleFunc("/raw", dbTable)
    http.ListenAndServe(":8080", nil)


func checkErr(err error) 
    if err != nil 
        panic(err)
    

layout.html

 define "Index" 
<!DOCTYPE html>
<html lang="en-US">
    <head>
        <title>Maithanam Website</title>
        <meta charset="UTF-8" />
    </head>
    <body>
        <h1>Maithanammm website for mysql</h1> 

     $length := len . 
    <h3>Length $length</h3> 

    <table border="1">
      <tr>
        <td>FirstName</td>
        <td>SecondName</td>
        <td>Department</td>
        <td>Email</td>
      </tr>
     range . 
      <tr>
        <td> .fname </td>
        <td>  .sname  </td>
        <td> .dname  </td>
        <td> .email  </td>
      </tr>
     end 
    </table>

    </body>
</html>
 end 

网页 enter image description here

【问题讨论】:

员工字段名称必须为exported。 ExecuteTemplate 返回的错误是什么?错误返回值当前被忽略。 【参考方案1】:

你有两个问题:

    当您调用 ExecuteTemplate 时,您并未检查错误。 您的模板正在使用未导出的字段,处理您的第一个问题会告诉您这一点。

对于第一个问题:

err := tmpl.ExecuteTemplate(w, "Index", table)
if err != nil 
    // Do something with the error

对于第二个问题,将您的 struct 更改为导出字段:

type Employee struct 
    Fname, Sname, Dname, Email string

然后更改您的模板以使用新的字段名称。

【讨论】:

非常感谢......我从没想过即使是可变大小写也有一些价值......很高兴知道...... 您可能想再次运行Go Tour,导出名称的大小写非常快。

以上是关于在 Golang 网站中使用模板显示 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章

golang 模板(template)的常用基本语法

golang 中 Template 的使用

更新变量时动态刷新模板的一部分golang

京东商品分类列表如何使用Golang+Lua应对亿级访问

Golang和HTTPS在网站前端接入里的高效应用

golang struct的使用