可以 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】:
所以我在这里为您提供一种解决方案,试试这个从查询中获取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)
【讨论】:
为什么只需要 1 行就获取所有行?改用SELECT * FROM tableName LIMIT 1;
;)以上是关于可以 Go 的 Rows.Scan 忽略 SQL 查询中的字段的主要内容,如果未能解决你的问题,请参考以下文章
database/sql rows.scan 在 350K 行后挂起
我必须在调用* sql.Tx.Rollback()之前调用* sql.Rows.Close()吗?