首页  >  文章  >  后端开发  >  如何使用未知表模式将“SELECT *”列读入 Go 中的 [] 字符串?

如何使用未知表模式将“SELECT *”列读入 Go 中的 [] 字符串?

Linda Hamilton
Linda Hamilton原创
2024-11-11 12:01:02984浏览

How to Read

如何在 Go 中将“SELECT *”列读入 []String

在 Go 中,可以借助 sql 来实现从数据库中获取行包,同时可以使用 csv 包来操作这些行并将它们写入 CSV 等文件中。然而,当表的架构未知并且需要动态确定时,就会出现一个问题。

问题:未知的表架构

Rows 类型中的 Scan 方法期望字段为基于表架构的特定类型。如果事先不了解此模式,则很难确定存在多少列及其类型。当尝试将列读入通用类型(例如 []string)时,这会带来挑战。

解决方案:使用接口类型

要解决此问题,需要使用 []interface{} 切片可用于指向 []string 切片中的每个字符串。这是必要的,因为 Scan 需要一个指向目标变量的指针数组。以下代码片段演示了这种方法:

package main

import (
    "database/sql"
    "fmt"
    "log"
)

func main() {
    // Establish a connection to the database.
    db, err := sql.Open("mysql", "user:pass@tcp(localhost:3306)/test")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Execute the "SELECT *" query.
    rows, err := db.Query("SELECT * FROM my_table")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    // Get the column names.
    cols, err := rows.Columns()
    if err != nil {
        log.Fatal(err)
    }

    // Create an interface{} slice pointing to each string in the []string slice.
    var readCols = make([]interface{}, len(cols))
    var writeCols = make([]string, len(cols))
    for i, _ := range writeCols {
        readCols[i] = &writeCols[i]
    }

    // Iterate over the rows and scan the columns into the string slice.
    for rows.Next() {
        if err := rows.Scan(readCols...); err != nil {
            log.Fatal(err)
        }
        fmt.Println(writeCols)
    }
}

在此示例中,readCols 切片包含指向 writeCols 切片中每个元素的指针。当调用 Scan 时,行中的值被分配给 readCols 指向的变量,这些变量随后被复制到 writeCols 切片中。这允许将数据库中的列动态读取到字符串切片中。

以上是如何使用未知表模式将“SELECT *”列读入 Go 中的 [] 字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn