首頁 > 後端開發 > Golang > 主體

如何使用未知表模式將「SELECT *」列讀入 Go 中的 [] 字串?

Linda Hamilton
發布: 2024-11-11 12:01:02
原創
1013 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板