从db.query读取数据时,除了扫描(scan)之外,还有其他的方法吗?

huangapple go评论80阅读模式
英文:

Is there any way other than scan when reading data from db.query?

问题

当我使用Scan函数时,我必须事先将所有变量写入Scan函数中。我需要一种解决方案,可以使用类似sprintf的方式来使用数据。

有没有一种方法可以在不定义变量的情况下访问数据?

例如:

row["unit_name"]

或者

unit_name, unit_position string

val := fmt.Sprintf("%s, %s", unit_name, unit_position_name)
row[val]
英文:

When I use scan I have to write all the variables into the scan beforehand. i need a solution where i can use data using things like sprintf

Is there a way I can access the data without defining a variable?

	func (dbs *item) ReadQuery() {
		var (
			unit_name, unit_position_name string
		)

		rows, err := db.Query(dbs.query)

		for rows.Next() {
			rows.Scan(&unit_name, &unit_position_name)

			if err != nil {
				log.Fatal(err)
			}

		}

	}

for example;

row["unit_name"]

or

unit_name,unit_position string

val:= fmt.Sprintf("%s , %s",unit_name,unit_position_name)
row[val]

答案1

得分: 2

以下是翻译好的内容:

这是如何在不显式声明行值变量的情况下扫描一行的方法。

为值创建一个切片。使用这些值的地址创建一个切片。扫描到这些地址。

func example(db *sql.DB, query string) {
    rows, err := db.Query(query)
    if err != nil {
        log.Fatal(err)
    }
    cols, err := rows.Columns()
    if err != nil {
        log.Fatal(err)
    }
    addrs := make([]interface{}, len(cols))
    for rows.Next() {
        values := make([]interface{}, len(cols))
        for i := range addrs {
            addrs[i] = &values[i]
        }
        err := rows.Scan(addrs...)
        if err != nil {
            log.Fatal(err)
        }
        // 变量 values 包含了行的值。
        // 这是一个使用 values 的示例。
        // 用你自己的代码替换 for 循环来处理行。
        for i := range cols {
            fmt.Printf("%s: %v\n", cols[i], values[i])
        }
    }
}

希望对你有帮助!

英文:

Here's how to scan a row without explicitly declaring a variable for value in the row.

Make a slice for the values. Make a slice with the address of those values. Scan to the addresses.

func example(db *sql.DB, query string) {
	rows, err := db.Query(query)
	if err != nil {
		log.Fatal(err)
	}
	cols, err := rows.Columns()
	if err != nil {
		log.Fatal(err)
	}
	addrs := make([]any, len(cols))
	for rows.Next() {
		values := make([]any, len(cols))
		for i := range addrs {
			addrs[i] = &values[i]
		}
		rows.Scan(addrs...)
		if err != nil {
			log.Fatal(err)
		}
        // The variable values contains the row values.
        // Here's an example of how to use the values.  
        // Replace the for loop with your code to
        // process the row.
		for i := range cols {
			fmt.Printf("%s: %v\n", cols[i], values[i])
		}
	}
}

huangapple
  • 本文由 发表于 2022年10月6日 23:50:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/73976729.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定