当前位置: 首页 > 面试题库 >

sql:扫描列数未知的行(从*中选择*)

公冶宏深
2023-03-14
问题内容

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

我知道我可以将sql从更改select *select my_favorite_rows,但是在这种情况下,我无法更改sql。


问题答案:

您可以使用Rows.Columns,例如

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)
}


 类似资料:
  • 问题内容: 是否可以检索中特定行的特定列? 假设我要使用以下查询文本从名为的表中选择名称为:a,b的行: 如何修改此查询文本以仅选择第2、12、22、32、42列,而不是选择其所有1000列? 问题答案: 将通配符替换为要检索的列名。 但是请阅读有关SQL标准的文档。您在表中需要1.000列的可能性很小。

  • 我刚刚更新了Nexus 5,我的应用程序的功能已经停止工作。 原因是接口LeScanCallback没有调用函数onLeScan。在下面的代码中,我使用了一些不推荐使用的代码,但我需要这样做,因为我正在测试一些技术。这是我启动蓝牙适配器的方式: 它可以在每个带有API的设备中工作 可能是什么原因? 提前非常感谢你。 问候。 拉斐尔。

  • 问题内容: 我收到以下异常。 java.util.NoSuchElementException:找不到行 我在编写一个需要从文本文件读取的较大程序时遇到了此错误,因此决定进行测试。 而且我仍然得到例外。我在与名为stricts.txt的类相同的文件夹中有一个文本文件,其中包含文本。我究竟做错了什么? 问题答案: 新的File(“ restrictions.txt”)将在应用程序的“开始目录”中查找

  • 我想从标准输入中读取一个双数,但是我总是得到这个异常: Java . util . inputmismatchexception 如果输入是整数,那没问题,但是如果是双精度的,我会得到异常。 线程“main”Java . util . inputmismatchexception Java . util . scanner . throw for(scanner . Java:864)Java .

  • 我有一个已知的数字x和几个命名的列(ix,col1,col2,col3),需要从每行(不一定是同一列)的col1,col2或col3中选择一个值,其中总数加起来就是已知的数字x。我很难弄清楚这件事的逻辑。 但是,我不能在sum语句中使用*,而且可能会返回来自每列的多个结果(尽管在不同的行中)。所以我不能选择col1,col2,col3等

  • 我想为这个代码寻求一些帮助。我没有问题读取一个文件本身和使用它作为扫描仪。我可以很容易地数出文件的双倍数。作为一个例子,这些是txt文件的前五个double。(这些数字应该是垂直列出的,但我几乎不怀疑这会有所不同) 这段代码总体上只是打印0.0的“num”数量,而不是将实际数字本身相加。请帮忙,谢谢。