可以 Go 的 Rows.Scan 忽略 SQL 查询中的字段

Posted

技术标签:

【中文标题】可以 Go 的 Rows.Scan 忽略 SQL 查询中的字段【英文标题】:Can Go's Rows.Scan ignore fields from SQL query 【发布时间】:2019-03-11 19:06:29 【问题描述】:

Rows.Scan 方法采用与 SQL 查询中的列一样多的参数。

由于正在执行的查询是 SHOW COLUMNS FROM my_table,我不能省略任何我不需要的列(或者我可以吗?)。

有什么方法可以忽略查询结果集中一些不需要的字段?

下面是我的代码:

rows, err := db.Query("SHOW COLUMNS FROM " + r.Name)
DieIf(err)
//var field, dataType, ignoreMe1, ignoreMe2, ignoreMe3 string
var field, dataType string
for rows.Next() 
                    //This Place
                    //   |
                    //   V
    if err := rows.Scan(&field, &dataType); err != nil 
        DieIf(err)
    
    r.Attributes[field] = Attribute
        Name:       field,
        DataType:   dataType,
        Constraint: false,
    

错误: sql: expected 5 destination arguments in Scan, not 2

【问题讨论】:

你不能忽略,如果选定的字段计数为 5,那么你必须传递 5 个变量来扫描 scan() ,如果你只想扫描两个值,那么你可以写像select field, type from <tableName>这样的查询 我无法在 SHOW COLUMNS QUERY 中传递字段名称。 因此您可以使用 `[]interface' 获取该值并根据您的要求使用。 我在下面附上了代码,试试这个,希望你能明白你的意思。谢谢。 【参考方案1】:

所以我在这里为您提供一种解决方案,试试这个从查询中获取fieldtype

package main

import (
    "fmt"
    _ "github.com/lib/pq"
    "database/sql"
)

func main() 

    db, _ := sql.Open(
        "postgres",
        "user=postgres dbname=demo password=123456")

    rows, _ := db.Query("SELECT * FROM tableName;")

    columns, _ := rows.Columns()
    count := len(columns)
    values := make([]interface, count)
    valuePtr := make([]interface, count)

    for rows.Next() 

        for i, _ := range columns 
            valuePtr[i] = &values[i]
        

        rows.Scan(valuePtr...)

        for i, col := range columns 

            var v interface

            val := values[i]

            b, ok := val.([]byte)

            if (ok) 
                v = string(b)
             else 
                v = val
            

            fmt.Println(col, v)
        
    

【讨论】:

为什么只需要 1 行就获取所有行?改用SELECT * FROM tableName LIMIT 1; ;)

以上是关于可以 Go 的 Rows.Scan 忽略 SQL 查询中的字段的主要内容,如果未能解决你的问题,请参考以下文章

database/sql rows.scan 在 350K 行后挂起

go postgresql array

我必须在调用* sql.Tx.Rollback()之前调用* sql.Rows.Close()吗?

golang 的数据库操作感觉不怎么好,哎,PHP 直接 mysql

go 通过赋值给 _ 来忽略序号和值

Go基础之基础....[忽略很糟的标题]