Can Go's Rows.Scan игнорирует поля из SQL-запроса - PullRequest
0 голосов
/ 06 октября 2018

Метод 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

1 Ответ

0 голосов
/ 06 октября 2018

Так что здесь у меня есть одно решение для вас, попробуйте это, чтобы получить field и type из запроса.

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