如何使用GORM一次读取一行SQLite数据库

如何使用GORM一次读取一行SQLite数据库,go,go-gorm,Go,Go Gorm,我有以下代码 package main import ( "database/sql" "fmt" "log" _ "github.com/mattn/go-sqlite3" ) func getDatabaseHandle(dbpath string) (*sql.DB, error) { database, err := sql.Open("sqlite3", dbpath) if err != nil { log.Pri

我有以下代码

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/mattn/go-sqlite3"
)

func getDatabaseHandle(dbpath string) (*sql.DB, error) {
    database, err := sql.Open("sqlite3", dbpath)
    if err != nil {
        log.Printf("Failed to create the handle")
        return nil, err
    }
    if err = database.Ping(); err != nil {
        fmt.Printf("Failed to keep connection alive")
        return nil, err
    }
    return database, nil
}

func getAllRows(database *sql.DB, table string) {
    query := fmt.Sprintf("SELECT User, AppName FROM %s LIMIT 10", table)
    rows, err := database.Query(query)
    if err != nil {
        panic(err)
    }
    defer rows.Close()
    for rows.Next() {
        var id int
        var app string
        rows.Scan(&id, &app)
        fmt.Println(id, app)
    }
}

func main() {
    db, err := getDatabaseHandle("./gozo.db")
    if err != nil {
        panic(err)
    }
    defer db.Close()
    getAllRows(db, "timesheet")
}
这是针对具有以下列的SQLite数据库的

id、用户、事项、AppName、AppDesc、持续时间、类型、时间戳

上面的代码非常完美。但有两个问题

  • 我需要为我打算在for循环中使用的每个列声明变量,for循环对rows.Next()执行
    ,这很烦人,而且不容易模块化

  • 我需要使用ORM工具来实现数据库的可移植性和所有功能

  • 因此,我绑定了,这是我的代码

    type Timesheet struct {
        id        int
        User      int
        Matter    int
        AppName   string
        AppDesc   string
        Duration  int64
        Type      string
        Timestamp string
    }
    
    // TableName -- Sets the table name
    func (ts Timesheet) TableName() string {
        return "timesheet"
    }
    
    func main() {
        db, err := gorm.Open("sqlite3", "./gozo.db")
        if err != nil {
            panic(err)
        }
        defer db.Close()
        var ts []Timesheet
        db.Find(&ts).Limit(5)
        fmt.Println(ts)
    }
    

    但这并没有正确地为我提供数据,而是为我提供了所有值0。此外,这并不是使用每个行扫描迭代,这样我就可以在执行其他相关操作时包装这个go并发性。这似乎在收集所有数据,这也是错误的。请告诉我如何使用GORM扫描循环中的每一行并获得正确的数据。

    我找到了答案。GORM文档并没有那么冗长,但流程可能是答案

    package main
    
    import (
        "fmt"
    
        "github.com/jinzhu/gorm"
        _ "github.com/jinzhu/gorm/dialects/sqlite"
    )
    
    // Product -- Represents a product
    type Product struct {
        gorm.Model
        Code  string
        Price uint
    }
    
    // TableName setting the table name
    func (Product) TableName() string {
        return "allProducts"
    }
    
    func main() {
        db, err := gorm.Open("sqlite3", "test.db")
        if err != nil {
            panic("failed to connect database")
        }
        defer db.Close()
        var product Product
        rows, err := db.Model(&Product{}).Rows()
        defer rows.Close()
        if err != nil {
            panic(err)
        }
        for rows.Next() {
            db.ScanRows(rows, &product)
            fmt.Println(product)
        }
    }
    

    结构看起来不太正确,您缺少gorm结构标记。和gorm模型,也是关于一次获取一行的初始问题。。您需要为循环设置一个限制值1和一个偏移计数器,对于第二个问题,我已经找到了答案,但是对于第一个问题,我不知道我的结构是如何错误的。