Go的扫描可以忽略SQL查询中的字段吗

iklwldmw  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(190)

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

im9ewurl

im9ewurl1#

所以这里我给你一个解决方案,试试这个从查询中得到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)
        }
    }
}
vohkndzv

vohkndzv2#

就像这个答案所暗示的那样,sqlx可能是一个不错的选择。
我个人使用db.Unsafe()来忽略不需要的字段。

type MyTable struct {
    // list the fields you want here
    Name   string `db:"name"`
    Field1 string `db:"field1"`
}

db := try(sqlx.ConnectContext(context.Background(), "mysql",
    fmt.Sprintf("root:@tcp(%s:%d)/?charset=utf8mb4&timeout=3s", host, port)))
db = db.Unsafe()

rows := try(db.Queryx("select * from mytable"))
for rows.Next() {
    myTable := MyTable{}
    rows.StructScan(&myTable)
}

相关问题