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 サイトの他の関連記事を参照してください。