Reputation: 43
I am in the process learning GoLang web development, where I am trying a simple example of display a table in mysql database at Webpage rendered using Golang template. Below is the snippet of my code, which is not working.Table rendering is failing,where range function at template not working
Server.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 }}
WebPage enter image description here
Upvotes: 3
Views: 3857
Reputation: 434785
You have two problems:
ExecuteTemplate
.For the first problem:
err := tmpl.ExecuteTemplate(w, "Index", table)
if err != nil {
// Do something with the error
}
For the second problem, change your struct
to have exported fields:
type Employee struct {
Fname, Sname, Dname, Email string
}
and then change your template to use the new field names.
Upvotes: 4