ホームページ >バックエンド開発 >Golang >不明なテーブルスキーマを使用してGoで「SELECT *」列を[]文字列に読み取る方法?

不明なテーブルスキーマを使用してGoで「SELECT *」列を[]文字列に読み取る方法?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-11 12:01:021019ブラウズ

How to Read

Go で "SELECT *" 列を []String に読み取る方法

Go では、SQL を使用してデータベースから行を取得できます。これらの行を操作して CSV などのファイルに書き込むときは、csv パッケージを使用して実行できます。ただし、テーブルのスキーマが不明で、動的に決定する必要がある場合、1 つ問題が発生します。

問題: 不明なテーブル スキーマ

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 スライスにコピーされます。これにより、データベースから文字列スライスへの列の動的読み取りが可能になります。

以上が不明なテーブルスキーマを使用してGoで「SELECT *」列を[]文字列に読み取る方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。