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

我正在使用SELECT *in adb.query()从表中返回列。通常,我会将fmt.Scan()行放入预先声明struct{}中以供进一步操作,但在这种情况下,表列经常更改,因此我无法将声明struct{}用作我的Scan().

我一直在努力弄清楚如何struct{}根据列结果动态构建 a db.query(),随后我可以调用 for Scan()。我已经阅读了一些内容,reflect但我正在努力确定这是否适合我的用例,或者我是否可能需要考虑其他事情。

任何指针将不胜感激。


慕桂英3389331
浏览 62回答 1
1回答

守着一只汪

您可以从结果行集中获取列名并为扫描准备一个切片。示例(https://go.dev/play/p/ilYmEIWBG5S):package mainimport (    "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方法。
打开App,查看更多内容
随时随地看视频慕课网APP