I am using Postgresql database . Here is my code block where I want to return multiple rows:
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