【问题标题】:sql: Scan error on column index 0, name "": unsupported Scan, storing driver.Value type int64 into type *main.SMSBlast?sql:列索引 0 上的扫描错误,名称“”:不支持扫描,将 driver.Value 类型 int64 存储到 *main.SMSBlast 类型中?
【发布时间】:2019-07-09 18:31:42
【问题描述】:

我现在尝试restful api,其中列SequenceID 不是自动增量,因为故意,当我这样计数时,我的问题是库gorm countSequenceId := db.Debug().Table("SMSBlast2").Count( &smsblast1) , 结果是 sql: Scan error on column index 0, name "": unsupported Scan, storage driver.Value type int64 into type *main.SMSBlast

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 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()
}

【问题讨论】:

  • Count() 需要 int64 类型的值参数,而不是 SMSBlast。尝试传递一个 int64 变量。
  • Count() 计算记录数,所以需要整数而不是结构体
  • @MadWombat,我尝试使用 db.raw 更改我的代码,您可以在下面看到我的代码我已经更改了我的代码,但现在我得到 [1 行受影响或返回],但是在我 fmt.Println(countSequenceId) print nil 之后,如何将结果计数显示到 golang ?
  • @hassansin 我已经更改了我的代码,我如何将查询 gorm 显示为像 count = 10 这样的字符串?
  • 这不是你的问题。您的问题是,无论您使用 Gorm 方法 Count() 还是原始 SQL,结果都是整数,而不是 SMSBlast。所以你需要传递对整数的引用,而不是对结构的引用。

标签: sql-server go orm


【解决方案1】:

您似乎认为 Gorm 方法会为您返回结果。这不是它的工作原理。 Gorm 返回错误或 nil,并且您将引用传递给要存储结果的变量。因此,要在某些东西上使用 Count(),您可以编写类似

的东西
var count int
db.Model(&SMSBlast{}).Count(&count)
fmt.Printf("count: %d\n", count)

也就是说,如果您只是想确保每次都获得一个新的序列 ID,为什么不使用自动增量?

type SMSBlast struct {
    SequenceID   int `gorm:"primary_key";column:"SequenceID";"AUTO_INCREMENT"`
    ... 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2017-05-13
    • 2019-07-05
    • 2017-12-07
    • 2019-06-05
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多