Как избежать использования следующего метода при получении количества строк - PullRequest
0 голосов
/ 10 марта 2019

В php я могу напечатать количество строк, где postid соответствует приведенному ниже коду, не передавая результат в цикле while.

$status_query = "SELECT count(*) as postCount FROM postData WHERE postid=1";
$status_result = mysqli_query($con,$status_query);
$status_row = mysqli_fetch_array($status_result);
$postCount = $status_row['postCount'];
echo $postCount;

Теперь я переписываю код в golang для того же количества строк.Я использую решение Stackoverflow, найденное здесь. ссылка на источник

С этой ссылкой решения Stackoverflow, приведенной выше, код golang работает отлично, так как я могу получить количество строк.

rows1, err := db.Query("SELECT COUNT(*) as postCount FROM postData WHERE postid=1")
if err != nil {
    log.Fatal(err)
}
defer rows1.Close()
var  postCount int

for rows1.Next() {   
    if err := rows1.Scan(& postCount); err != nil {
        log.Fatal(err)
    }
}

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

Здесьчто я хочу изменить:

Приведенный выше код прошел результат подсчета строк в

for rows1. Next(){
// result here.
}

M y вопрос:

Пожалуйстакак мне избежать этой for rows.next() функции и просто получить мой результат прямо, так как я получаю количество строк на основе postid.В приведенном выше PHP-коде я могу получить результат напрямую, не передавая его в цикле while.

В golang я думаю о чем-то похожем на код ниже

rows1, err := db.Query("SELECT COUNT(*) as postCount FROM postData WHERE postid=1")
if err != nil {
    log.Fatal(err)
}
defer rows1.Close()
var status_row = rows1.Next() 

var postCount =rows1.Scan(& postCount)
fmt.Printf("Number of rows are %s\n",  postCount)

Есть ли у кого-нибудь лучший способ заставить этот счетчик строк отображать прямо, не передавая результат в течение rows1.Next() метода

Вот общий рабочий код, прежде чем искать модификацию на иллюстрациях кодирования выше.

package main

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

import "net/http"
import "fmt"
import "log"

var db *sql.DB
var err error


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

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

//The commented section below is the code I want to modify to avoid use of for rows.next function....
/*
rows1, err := db.Query("SELECT COUNT(*) as postCount FROM like_unlike WHERE postid=1")
if err != nil {
    log.Fatal(err)
}
defer rows1.Close()
var  postCount int

for rows1.Next() {   
    if err := rows1.Scan(& postCount); err != nil {
        log.Fatal(err)
    }
}

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

}
*/


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 голосов
/ 10 марта 2019

Как правило, если вы знаете, что получаете одну строку, используйте DB.QueryRow Это позволяет объединить запрос в цепочку и отсканировать вместе, поэтому ваш пример будет выглядеть так:

var  postCount int
err := db.QueryRow("SELECT COUNT(*) as postCount FROM postData WHERE postid=1").Scan(&postCount)
if err != nil {
    log.Fatal(err)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...