Как правильно отображать все записи в виде массивов через JSON - PullRequest
0 голосов
/ 11 марта 2019

Последние 38 часов я изучаю голанг и кодирую это.Это то, что делает этот код.

Код golang ниже отображает две записи из базы данных в массиве через json.На данный момент это ответ json, который я получаю, когда я запускаю код, и пока все в порядке ..

[
{"id":"1",
"title":"Post Title 1 ",
"content":"post content 1."
},

{"id":"2",
"title":"post Title 2 ",
"content":"post content 2 "
}
]

На данный момент postlikeCount и postunlikeCount не выбираются в массиве, потому что они находятся в другой таблице.

Если все работает нормально, я должен получить такой массив, который содержит все, как показано в примере ниже.

[
{"id":"1",
"title":"Post Title 1 ",
"content":"post content 1.",
"postlikeCount":"2",
"postunlikeCount":"1"},

{"id":"2",
"title":"post Title 2 ",
"content":"post content 2 ",
"postlikeCount":"4",
"postunlikeCount":"0"}
]

Теперьчтобы получить postlikeCount и postunlikeCount , я реализовал две секции кодировок, ниже которых я прошел в post for rows.next() functions.

// get postlikeCount based on userid and postid
var userid =5
var  postlikeCount int
err := db.QueryRow("SELECT COUNT(*) as postlikeCount FROM postData WHERE postid=? and userid=?", postid,userid).Scan(&postlikeCount)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Number of postlikeCount rows are %s\n",  postlikeCount)


// get postunlikeCount  based on userid and postid

var  postunlikeCount int
err1 := db.QueryRow("SELECT COUNT(*) as postunlikeCount FROM postData WHERE postid=? and userid=?", postid,userid).Scan(&postunlikeCount)
if err1 != nil {
    log.Fatal(err1)
}

fmt.Printf("Number of postunlikeCount rows are %s\n",  postunlikeCount)

Два вышеуказанных кода работают нормальнокак я могу напечатать их соответствующие сообщения, как и в отличие от счета.

Вот моя проблема:

Когда я пытался пройти и добавить postlikeCount и postunlikeCount параметров, чтобы я мог распечатать их в формате json согласно этой строке кода

posts = append(posts, post, postlikeCount,postunlikeCount)

Отображается ошибка

cannot postlikeCount (type int) as type post in append
cannot use postunlikeCount (type int) as type post in append

Должна ли эта ошибка иметьс функцией Struct.Пожалуйста, может кто-нибудь помочь мне исправить это.Мне нужно передать postlikeCount и postunlikeCount как часть json, как видно из полного результата массива выше.

вот полный рабочий код на данный момент.

package main

import "database/sql"
import _ "github.com/go-sql-driver/mysql"

import "net/http"
import "fmt"
import "encoding/json"
import "log"

var db *sql.DB
var err error

type Post struct {
Id  int
Title string
Content string  

}



func getRecordPage1(res http.ResponseWriter, req *http.Request) {

    if req.Method != "POST" {
        http.ServeFile(res, req, "getjsonRecord.html")
        return
    }


var (
post  Post
posts []Post
)

rows, err := db.Query("SELECT id,title,content FROM posts")
if err != nil {
            http.Error(res, "display error, unable to select records in json", 500)
            return
        }

for rows.Next() {

var postid =post.Id
var title = post.Title
var content = post.Content

fmt.Printf("%s is now %d\n", postid, title, content)


// get postlikeCount based on userid and postid
var userid =5
var  postlikeCount int
err := db.QueryRow("SELECT COUNT(*) as postlikeCount FROM postData WHERE postid=? and userid=?", postid,userid).Scan(&postlikeCount)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Number of postlikeCount rows are %s\n",  postlikeCount)


// get postunlikeCount  based on userid and postid

var  postunlikeCount int
err1 := db.QueryRow("SELECT COUNT(*) as postunlikeCount FROM postData WHERE postid=? and userid=?", postid,userid).Scan(&postunlikeCount)
if err1 != nil {
    log.Fatal(err1)
}

fmt.Printf("Number of postunlikeCount rows are %s\n",  postunlikeCount)





rows.Scan(&post.Id, &post.Title, &post.Content)
posts = append(posts, post)

//like of code comment which causes issues
//posts = append(posts, post,postlikeCount,postunlikeCount)
}
defer rows.Close()


jsonResponse, jsonError := json.Marshal(posts)
if jsonError != nil {
fmt.Println(jsonError)
}

if jsonResponse == nil {
fmt.Println(jsonError)
} else {
res.Header().Set("Content-Type", "application/json")
res.Write(jsonResponse)
 fmt.Println("Json results displayed successfully")
}



}



func homePage(res http.ResponseWriter, req *http.Request) {
    http.ServeFile(res, req, "index.html")
}

func main() {
    db, err = sql.Open("mysql", "root:@/golang44")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        panic(err.Error())
    }

    http.HandleFunc("/getjsonRecord", getRecordPage1)
    http.HandleFunc("/", homePage)
        fmt.Println("Listening on 127.0.0.1:8088")
    http.ListenAndServe(":8088", nil)
}

1 Ответ

3 голосов
/ 11 марта 2019

Добавить PostLikeCount и PostUnlikeCount до Пост struct:

type Post struct {
    Id              int
    Title           string
    Content         string
    PostLikeCount   int
    PostUnlikeCount int
}

После запроса «ВЫБЕРИТЕ COUNT (*) как postlikeCount FROM postData ...»:

post.PostLikeCount = postlikeCount

После запроса «ВЫБЕРИТЕ COUNT (*) как postunlikeCount FROM postData ...»:

post.PostUnlikeCount = postunlikeCount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...