I am using Postgresql database . Here is my code block where I want to return multiple rows:
x
type NewsPaper struct {
language string
logo_url string
slug string
ranking string
title string
search_term string
}
func GetNewsPapers() []byte{
db := GetDB()
newspaper := NewsPaper{}
var json = jsoniter.ConfigCompatibleWithStandardLibrary
rows, err := db.Query(`SELECT title, language, ranking, slug, search_term, logo_url FROM public.news_newspaper`)
if err != nil {
log.Println(err)
}
defer rows.Close()
//results := []NewsPaper // error : type []NewsPaper is not an expression
for rows.Next() {
err = rows.Scan(&newspaper.title, &newspaper.language, &newspaper.ranking, &newspaper.slug, &newspaper.search_term, &newspaper.logo_url)
if err != nil {
log.Println(err)
}
//results = append(results, newspaper)
}
fmt.Println(newspaper) // printing last row
err = rows.Err()
if err != nil {
panic(err)
}
values, _ := json.Marshal(newspaper)
//fmt.Println(values)
return values
}
Problem is its returning last row from the table. I also tried to store result in array, but I am not succeed.
Advertisement
Answer
You are setting same struct variable for every row that’s why you are getting last row info only.
Use results := []NewsPaper{}
for create empty slice and create new struct for every row. This should work, I added some comments.
rows, err := db.Query(`SELECT title, language, ranking, slug, search_term, logo_url FROM public.news_newspaper`)
if err != nil {
log.Println(err)
}
results := []NewsPaper{} // creating empty slice
defer rows.Close()
for rows.Next() {
newspaper := NewsPaper{} // creating new struct for every row
err = rows.Scan(&newspaper.title, &newspaper.language, &newspaper.ranking, &newspaper.slug, &newspaper.search_term, &newspaper.logo_url)
if err != nil {
log.Println(err)
}
results = append(results, newspaper) // add new row information
}
fmt.Println(results) // printing result