Некорректный вывод в html
Есть код html
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<tr>
<td>{{.IdU}}</td>
<td>{{.Name}}</td>
<td>{{.SecName}}</td>
<td>{{.Id}}</td>
<td>{{.Company}}</td>
<td>{{.Model}}</td>
<td>{{.Price}}</td>
<br>
</tr>
</body>
</html>
И код golang
package main
import (
"database/sql"
"net/http"
"text/template"
_ "github.com/lib/pq"
)
type Names struct {
IdU int
Name string
SecName string
Id int
Company string
Model string
Price int
}
var dbpath string = "host=192.168.1.103 port=5432 user=postgres dbname=phones sslmode=disable password=mypass"
func GetNames() {
http.HandleFunc("/data", func(w http.ResponseWriter, r *http.Request) {
db, _ := sql.Open("postgres", dbpath)
defer db.Close()
rows, _ := db.Query("select * from Names")
rowsp, _ := db.Query("select * from Products")
defer rows.Close()
defer rowsp.Close()
names := []Names{}
for rows.Next() || rowsp.Next() {
n := Names{}
rows.Scan(&n.IdU, &n.Name, &n.SecName)
rowsp.Scan(&n.Id, &n.Company, &n.Model, &n.Price)
names = append(names, n)
}
for _, n := range names {
names := Names{
IdU: n.IdU,
Name: n.Name,
SecName: n.SecName,
Id: n.Id,
Company: n.Company,
Model: n.Model,
Price: n.Price,
}
templn, _ := template.ParseFiles("./user.html")
templn.Execute(w, names)
}
})
http.ListenAndServe(":8181", nil)
}
func main() {
GetNames()
}
Вместе они должны выводить на страницу html на сервере данные из таблицы базы postgresql. И они это делают но вывод получается некорректный. Вот такой
1 Maksim Donets 0 0
2 Maksim Pupkin 0 0
0 1 Iphone XR Apple 44000
0 2 Iphone SE Apple 29000
0 3 AirPods Pro Apple 11000
0 4 AirDods 2 Pro Xiaomi 5000
0 5 Note 9 Pro Xiaomi 25000
0 6 6300 Nokia 5000
В конце 1 и 2 строк и в начале всех следующих есть нули. Их быть не должно. Подскажите пожалуйста как из убрать? Данные в базе такие.данные в базе
Ответы (1 шт):
Автор решения: Senior Pomidor
→ Ссылка
все это можно упростить и сделать 1 выборку из базы вместо двух. Вам все равно меджить их надо в одну.
в темплейте нужно указывать {{range .}} и передать массив данных, а не 1 экземпляр Names
import (
"database/sql"
"fmt"
"net/http"
"text/template"
_ "github.com/lib/pq"
)
type Names struct {
IdU int
Name string
SecName string
Id int
Company string
Model string
Price int
}
var dbpath string = "host=192.168.1.103 port=5432 user=postgres dbname=phones sslmode=disable password=mypass"
func GetNames() {
http.HandleFunc("/data", func(w http.ResponseWriter, r *http.Request) {
db, _ := sql.Open("postgres", dbpath)
defer db.Close()
rows, _ := db.QueryContext(r.Context(),`select n.*, p.* from "Names" n, "Products" p;`)
defer rows.Close()
names := []Names{}
for rows.Next(){
n := Names{}
err := rows.Scan(&n.IdU, &n.Name, &n.SecName, &n.Id, &n.Company, &n.Model, &n.Price)
if err != nil {
fmt.Println(err)
continue
}
fmt.Printf("%#v\n", n)
names = append(names, n)
}
templn, err := template.ParseFiles("/tmp/user.html")
if err != nil {
panic(err)
}
err = templn.Execute(w, names)
if err != nil {
panic(err)
}
})
err := http.ListenAndServe(":8181", nil)
if err != nil {
panic(err)
}
}
func main() {
GetNames()
}
<html>
<head>
<meta charset="utf-8">
</head>
<body>
{{range .}}
<tr>
<td>{{.IdU}}</td>
<td>{{.Name}}</td>
<td>{{.SecName}}</td>
<td>{{.Id}}</td>
<td>{{.Company}}</td>
<td>{{.Model}}</td>
<td>{{.Price}}</td>
<br>
</tr>
{{end}}
</body>
</html>
вывод
1 Maksim Donets 1 Iphone XR Apple 44000
1 Maksim Donets 2 Iphone SE Apple 29000
1 Maksim Donets 3 AirPods Pro Apple 11000
1 Maksim Donets 4 AirDods 2 Pro Xiaomi 5000
1 Maksim Donets 5 Note 9 Pro Xiaomi 25000
1 Maksim Donets 6 6300 Nokia 5000
2 Maksim Pipkin 1 Iphone XR Apple 44000
2 Maksim Pipkin 2 Iphone SE Apple 29000
2 Maksim Pipkin 3 AirPods Pro Apple 11000
2 Maksim Pipkin 4 AirDods 2 Pro Xiaomi 5000
2 Maksim Pipkin 5 Note 9 Pro Xiaomi 25000
2 Maksim Pipkin 6 6300 Nokia 5000