sql:扫描具有未知列数的行(选择* from ...) [英] sql: scan row(s) with unknown number of columns (select * from ...)

查看:89
本文介绍了sql:扫描具有未知列数的行(选择* from ...)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含很多列的表 t ,我的sql如下所示: select * from t 。现在我只想从广泛的返回行集合中扫描一列或两列。但是,sql.Scan接受 dest ... interface {} 作为参数。是否意味着我必须扫描所有内容并只使用我需要的列?

I have a table t containing a lot of columns, and my sql is like this: select * from t. Now I only want to scan one column or two from the wide returned row set. However, the sql.Scan accepts dest ...interface{} as arguments. Does it mean I have to scan everything and use only the column I needed?

我知道我可以从 select * select my_favorite_rows ,但是,在这种情况下,我没有办法改变sql。

I know I could change the sql from select * to select my_favorite_rows, however, in this case, I have no way to change the sql.

感谢,
Elgs

Thanks, Elgs

推荐答案

您可以使用Rows.Columns,例如

You can make use of Rows.Columns, e.g.

package main

import (
    "database/sql"
    "fmt"

    "github.com/lib/pq"
)

type Vehicle struct {
    Id     int
    Name   string
    Wheels int
}

// VehicleCol returns a reference for a column of a Vehicle
func VehicleCol(colname string, vh *Vehicle) interface{} {
    switch colname {
    case "id":
        return &vh.Id
    case "name":
        return &vh.Name
    case "wheels":
        return &vh.Wheels
    default:
        panic("unknown column " + colname)
    }
}

func panicOnErr(err error) {
    if err != nil {
        panic(err.Error())
    }
}

func main() {
    conn, err := pq.ParseURL(`postgres://docker:docker@172.17.0.2:5432/pgsqltest?schema=public`)
    panicOnErr(err)

    var db *sql.DB
    db, err = sql.Open("postgres", conn)
    panicOnErr(err)

    var rows *sql.Rows
    rows, err = db.Query("select * from vehicle")
    panicOnErr(err)

    // get the column names from the query
    var columns []string
    columns, err = rows.Columns()
    panicOnErr(err)

    colNum := len(columns)

    all := []Vehicle{}

    for rows.Next() {
        vh := Vehicle{}

        // make references for the cols with the aid of VehicleCol
        cols := make([]interface{}, colNum)
        for i := 0; i < colNum; i++ {
            cols[i] = VehicleCol(columns[i], &vh)
        }

        err = rows.Scan(cols...)
        panicOnErr(err)

        all = append(all, vh)
    }

    fmt.Printf("%#v\n", all)
}

这篇关于sql:扫描具有未知列数的行(选择* from ...)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆