如何将MySQL中所有平方数数据传递至Golang HTML模板生成表格?
把数据库中所有数字平方数据展示到HTML表格的解决方案
我来帮你搞定这个需求,要实现把数据库里所有数字和对应的平方数用表格展示在index.html里,我们需要调整数据结构、查询逻辑、Handler以及模板这几个部分,一步步来:
1. 定义适配多条数据的结构体
原来的pageData只能存单个平方数,现在要存储一组记录,所以我们先定义两个结构体:
// 存储单条数字和平方数的记录 type SquareRecord struct { Number int // 原始数字 SquareNum int // 对应的平方数 } // 传递给模板的页面数据,包含所有记录的切片 type PageData struct { Records []SquareRecord }
2. 修改数据库查询逻辑,获取全部数据
你原来的代码是单个查询特定数字的平方,现在要改成查询表中所有数据。注意:最好把查询逻辑移到请求Handler里(避免全局变量的问题),或者在main里查询后传递给Handler,但更推荐在Handler里处理,因为每次请求都可能需要最新数据。
在idx Handler里添加查询所有数据的逻辑:
func idx(w http.ResponseWriter, r *http.Request) { // 重新打开数据库连接(main里的连接会被defer关闭,所以每次请求需要新连接,或者用连接池) db, err := sql.Open("mysql", "root:@/godb") if err != nil { log.Println(err) http.Error(w, "服务器内部错误", http.StatusInternalServerError) return } defer db.Close() // 查询表中所有的数字和平方数 rows, err := db.Query("SELECT number, squareNum FROM squarenum") if err != nil { log.Println(err) http.Error(w, "服务器内部错误", http.StatusInternalServerError) return } defer rows.Close() // 遍历查询结果,存入切片 var records []SquareRecord for rows.Next() { var num, square int if err := rows.Scan(&num, &square); err != nil { log.Println(err) http.Error(w, "服务器内部错误", http.StatusInternalServerError) return } records = append(records, SquareRecord{Number: num, SquareNum: square}) } // 检查遍历过程中是否出现错误 if err := rows.Err(); err != nil { log.Println(err) http.Error(w, "服务器内部错误", http.StatusInternalServerError) return } // 组装页面数据,传递给模板 pd := PageData{ Records: records, } err = tpl.ExecuteTemplate(w, "index.html", pd) if err != nil { log.Println("模板渲染错误:", err) http.Error(w, "服务器内部错误", http.StatusInternalServerError) return } }
3. 提前解析模板(避免重复解析)
在main函数之外添加模板初始化的逻辑,确保模板只解析一次:
var tpl *template.Template // init函数会在main之前执行 func init() { tpl = template.Must(template.ParseFiles("index.html")) }
4. 编写index.html模板,用表格展示数据
在模板里使用Go模板的range语法遍历所有记录,生成符合要求的表格:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>数字平方表</title> <style> table { border-collapse: collapse; margin: 2rem auto; width: 80%; } th, td { border: 1px solid #e0e0e0; padding: 0.8rem; text-align: center; } th { background-color: #f5f5f5; font-weight: bold; } tr:hover { background-color: #fafafa; } </style> </head> <body> <h1 style="text-align: center;">数字平方对照表</h1> <table> <thead> <tr> <th>计算表达式</th> <th>平方结果</th> </tr> </thead> <tbody> <!-- 遍历所有记录,生成表格行 --> {{range .Records}} <tr> <td>{{.Number}} × {{.Number}} = {{.SquareNum}}</td> <td>{{.SquareNum}}</td> </tr> {{end}} </tbody> </table> </body> </html>
完整的main函数调整
最后把main函数里的单个查询逻辑删掉,保留插入数据的部分(可以只运行一次后注释掉,避免重复插入):
func main() { db, err := sql.Open("mysql", "root:@/godb") if err != nil { panic(err.Error()) // 实际项目建议用更友好的错误处理 } defer db.Close() // 插入测试数据(只需要运行一次,之后可以注释掉) stmtIns, err := db.Prepare("INSERT INTO squarenum VALUES(?, ?, ? )") if err != nil { panic(err.Error()) } defer stmtIns.Close() for i := 1; i < 50; i++ { _, err = stmtIns.Exec(0, i, (i * i)) if err != nil { panic(err.Error()) } } fmt.Println("服务器启动在 :8888,访问 http://localhost:8888 查看结果") http.HandleFunc("/", idx) http.ListenAndServe(":8888", nil) }
一些注意点
- 确保你的
squarenum表结构和插入语句匹配,比如表有三个字段(第一个是自增ID,所以插入时传0让数据库自动生成)。 - 插入数据的代码只需要运行一次,之后记得注释掉,不然每次启动服务器都会重复插入数据。
- 实际生产环境中不要用
panic处理错误,应该用log.Println记录错误后返回http.Error给用户。 - 可以优化数据库连接,使用连接池而不是每次请求都新建连接,比如设置
db.SetMaxOpenConns(10)等参数。
内容的提问来源于stack exchange,提问作者mac
相关产品推荐
相关产品推荐

