我正在构建一个基于 web 的数据浏览器,名为 mavgo flight。 我希望 sqlite 中的大型表能够连续打印,而不是仅在所有数据可用时才打印的默认行为。我尝试按每行数据运行模板,但失败了。
func renderHTMLTable(w http.ResponseWriter, result *sqlx.Rows) {
cols, err := result.Columns()
if err != nil {
log.Println(err, "renderHTMLTable")
return
}
tmpl, err := template.ParseFiles("./templates/2d.html")
if err != nil {
log.Println("template failed", err)
return
}
data := HTMLTable{}
data.Cols = cols
for result.Next() {
cols, err := result.SliceScan()
if err != nil {
log.Println(w, err)
break
}
s := make([]string, len(cols))
for i, v := range cols {
s[i] = fmt.Sprint(v)
}
tmpl.Execute(w, s)
}
}
正确答案
我放弃了聪明,完全按照 cerise 的建议去做 增量写入行的函数:
func renderHTMLTable(w http.ResponseWriter, result *sqlx.Rows) {
cols, err := result.Columns()
if err != nil {
log.Println(err, "renderHTMLTable")
return
}
head, err := template.ParseFiles("./templates/head.html")
if err != nil {
log.Println("template failed", err)
return
}
row, err := template.ParseFiles("./templates/row.html")
if err != nil {
log.Println("template failed", err)
return
}
foot := ` </tbody>
</table>
</body>
</html>`
head.Execute(w, cols)
s := make([]string, len(cols))
for result.Next() {
values, err := result.SliceScan()
if err != nil {
log.Println(w, err)
break
}
for i, v := range values {
s[i] = fmt.Sprint(v)
}
row.Execute(w, s)
}
fmt.Fprint(w, foot)
}