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

如何从不可预测的 db.Query() 创建新结构?

如何从不可预测的 db.Query() 创建新结构?

Go
慕桂英3389331 2022-10-31 17:24:43
我正在使用SELECT *in adb.query()从表中返回列。通常,我会将fmt.Scan()行放入预先声明struct{}中以供进一步操作,但在这种情况下,表列经常更改,因此我无法将声明struct{}用作我的Scan().我一直在努力弄清楚如何struct{}根据列结果动态构建 a db.query(),随后我可以调用 for Scan()。我已经阅读了一些内容,reflect但我正在努力确定这是否适合我的用例,或者我是否可能需要考虑其他事情。任何指针将不胜感激。
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

您可以从结果行集中获取列名并为扫描准备一个切片。

示例(https://go.dev/play/p/ilYmEIWBG5S):

package main


import (

    "database/sql"

    "fmt"

    "log"


    "github.com/DATA-DOG/go-sqlmock"

)


func main() {

    // mock db

    db, mock, err := sqlmock.New()

    if err != nil {

        log.Fatal(err)

    }


    columns := []string{"id", "status"}


    mock.ExpectQuery("SELECT \\* FROM table").

        WillReturnRows(sqlmock.NewRows(columns).AddRow(1, "ok"))


    // actual code

    rows, err := db.Query("SELECT * FROM table")

    if err != nil {

        log.Fatal(err)

    }


    cols, err := rows.Columns()

    if err != nil {

        log.Fatal(err)

    }


    data := make([]interface{}, len(cols))

    strs := make([]sql.NullString, len(cols))

    for i := range data {

        data[i] = &strs[i]

    }


    for rows.Next() {

        if err := rows.Scan(data...); err != nil {

            log.Fatal(err)

        }

        for i, d := range data {

            fmt.Printf("%s = %+v\n", cols[i], d)

        }

    }

}

此示例将所有列读入字符串。要检测列类型,可以使用rows.ColumnTypes方法。


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信