为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在不先在Golang func中扫描的情况下从数据库返回行结果吗?

我可以在不先在Golang func中扫描的情况下从数据库返回行结果吗?

Go
拉丁的传说 2022-09-26 19:33:28
我有使用Golang的迷你项目,我的计划是制作一个基本函数,它将从模型中调用以执行sql查询,然后返回行结果而无需先扫描它。我正在使用这种方式来防止忘记编写和代码,以便在模型中执行查询更简单。我尝试过这种方式,但是当尝试打印结果时,我得到了零,没有任何错误。这是我的屏幕拍摄。当执行查询和扫描的行结果在同一函数中时,结果就存在。也许我错过了什么?这是我的第一个问题,抱歉它太长了。谢谢defer rows.Close()将在其中执行 SQL 查询并返回结果的基本模型package modelimport "database/sql"import "hb-backend-v1/config/database"import "fmt"func Query(query string) (*sql.Rows, error){    connect, err := database.Connect()    if err != nil{        fmt.Println("Connection Failed")        return nil, err    }    fmt.Println("Connection Success")    defer connect.Close()    rows, err := connect.Query(query)    defer rows.Close()    if err != nil{        return nil, err    }    return rows, nil}
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

两者一旦退出就会被关闭,在这两个关闭后,您将无法再使用。connectionrowsQueryrows


解决这个问题的一种方法是传递一个闭包,并在关闭两个资源之前执行它:QueryQuery


func Query(query string, scan func(*sql.Rows) error) error {

    connect, err := database.Connect()

    if err != nil{

        return err

    }

    defer connect.Close()


    rows, err := connect.Query(query)

    if err != nil{

        return err

    }

    defer rows.Close()


    return scan(rows)

}

func ProductList() ([]Hasil, error) {

    var result []Hasil

    err := model.Query("SELECT * FROM alamat_store", func(rows *sql.Rows) error {

        for rows.Next() {

            var each = Hasil{}

            var err = rows.Scan(&each.Id_alamat_store, &each.Id_tk, &each.Alamat, &each.Id_wil, &each.Latitude, &each.Longitude)

            if err != nil {

                return err

            }

            result = append(result, each)

        }

        return nil

    })

    if err != nil {

        return nil, err

    }

    return result, nil

}


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号