Как отображать количество результатов из запроса

Я работаю над проектом RESTful API, и у меня проблема с тем, что мой код может запрашивать с помощью gorm, мой запрос похож на этот countSequenceId := db.Debug().Raw("SELECT COUNT (*) FROM SMSBlast2").Scan(&smsblast1). У меня есть результат [1 rows affected or returned], что означает успех для подсчета всей моей строки в базе данных, но я хочу отобразить результат как result count = 10, но как?

Изображение

 package main

import (
    "encoding/json"
    "fmt"
    "github.com/gorilla/mux"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mssql"
    "log"
    "net/http"
    "strconv"
    "time"
)

type SMSBlast struct {
    SequenceID   int `gorm:"primary_key";column:"SequenceID"`
    MobilePhone string `gorm:"column:MobilePhone"`
    Output  string  `gorm:"column:Output"`
    WillBeSentDate *time.Time `gorm:"column:WillBeSentDate"`
    SentDate *time.Time `gorm:"column:SentDate"`
    Status *string `gorm:"column:Status"`
    DtmUpd time.Time `gorm:"column:DtmUpd"`
}

func (SMSBlast) TableName() string {
    return "SMSBlast2"
}

func allSMSBlasts(w http.ResponseWriter, r *http.Request){
    db, err := gorm.Open("mssql", "sqlserver://sa:@localhost:1433?database=CONFINS")
    if err != nil{
        panic("failed to connect database")
    }
    defer db.Close()

    var smsblasts []SMSBlast
    db.Debug().Find(&smsblasts)
    fmt.Println("{}",smsblasts)

    json.NewEncoder(w).Encode(smsblasts)
}

func insertSMSBlast(w http.ResponseWriter, r *http.Request){
    fmt.Println("New Insert Created")

    db, err := gorm.Open("mssql", "sqlserver://sa:@localhost:1433?database=CONFINS")
    if err != nil{
        panic("failed to connect database")
    }
    defer db.Close()

    vars := mux.Vars(r)
    mobilephone := vars["mobilephone"]
    output := vars["output"]

    var(
        smsblast1 SMSBlast
    )


    countSequenceId := db.Debug().Raw("SELECT COUNT (*) FROM SMSBlast2").Scan(&smsblast1)
    fmt.Println(countSequenceId)


    msg, err :=  json.Marshal(countSequenceId)
    if err != nil{
        fmt.Println(err.Error())
    }



    sequenceid1,_ := strconv.Atoi(string(msg))
    fmt.Println("SequenceID : " , sequenceid1)

    smsblasts := SMSBlast{SequenceID: sequenceid1,MobilePhone: mobilephone,Output:output, DtmUpd: time.Now()}
    prindata := db.Create(&smsblasts)
    fmt.Println(prindata)

func handleRequests(){
    myRouter := mux.NewRouter().StrictSlash(true)
    myRouter.HandleFunc("/smsblaststest",allSMSBlasts).Methods("POST")
    myRouter.HandleFunc("/smsblaststestInsert/{mobilephone}/{output}", insertSMSBlast).Methods("POST")
    log.Fatal(http.ListenAndServe(":8080",myRouter))

}

func main(){
    fmt.Println("SMSBLASTS ORM")
    handleRequests()
}

person dera ta    schedule 16.02.2019    source источник
comment
Если вы посмотрите документацию по БД, вы увидите, что почти все ее методы возвращают сам экземпляр *DB, включая Scan и Count и это означает, что countSequenceId не является ни id , ни count.   -  person mkopriva    schedule 16.02.2019
comment
Вы можете попробовать x := db.Find(&smsblasts) fmt.Println(x.RowsAffected)   -  person iamvinitk    schedule 18.02.2019


Ответы (1)


Я не уверен, почему вы используете для этого метод Raw, но я хотел бы указать, что есть метод Count для достижения того, чего вы хотите: http://gorm.io/docs/query.html#Count

db.Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Find(&users).Count(&count)
//// SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users)
//// SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)

db.Model(&User{}).Where("name = ?", "jinzhu").Count(&count)
//// SELECT count(*) FROM users WHERE name = 'jinzhu'; (count)

Я собрал очень простой пример из документации:

package main

import (
    "fmt"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
)

type Porg struct {
    gorm.Model
    Name string
}

func main() {
    db, err := gorm.Open("sqlite3", "test.db")
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    // Migrate the schema
    db.AutoMigrate(&Porg{})

    // Create
    for i := 1; i <= 100; i++ {
        db.Create(&Porg{Name: "John"})
    }

    // Read
    var porgs []Porg
    var count int
    db.Model(&porgs).Count(&count)

    fmt.Println(count)
}

Выход: 100

Используя метод Model, вы можете указать модель для запроса, это не будет напрямую запрашивать БД. Использование db.Find(&porgs).Count(&count) фактически отправит 2 SQL-запроса в базу данных.

person Carlos Martinez    schedule 16.02.2019
comment
Я хочу подсчитать свою строку, а не зацикливаться, я хочу извлечь [1 затронутую или возвращенную строку], чтобы отобразить количество - person dera ta; 16.02.2019
comment
Сообщение [1 rows affected or returned исходит от метода Debug(), оно просто позволяет быстрее отлаживать проблемы. Count не перебирает результаты, он отправляет SELECT COUNT(*) Table запрос в вашу базу данных. - person Carlos Martinez; 16.02.2019
comment
Я обновил пример, используя Model().Count(), вы можете отправить только один SQL-запрос в базу данных, а не 2, как при использовании Find() - person Carlos Martinez; 16.02.2019