を使用して、データベース テーブルから csv ファイルに行をダンプする Go プログラムを作成したいと考えていますSELECT *
。
Go は優れたsqlおよびcsv APIを提供しcsv
ますが、文字列の配列と、型に応じて「塗りつぶし」フィールドScan
内のメソッドを想定しています。Rows
以前はテーブルを知らなかったので、列がいくつあり、それらの型が何であるかわかりません。
Go での最初のプログラムなので、少し苦労しています。
Rows
インスタンスから列を読み取るにはどうすればよい[]string
ですか?それは「正しい」方法ですか?
ありがとう!
アップデート
私はまだパラメータに苦労しています。これは私のコードです。今panic
のところ、 を返す代わりに使用しerror
ていますが、後で変更する予定です。私のテストでは、クエリ結果とos.Stdout
.
func dumpTable(rows *sql.Rows, out io.Writer) error {
colNames, err := rows.Columns()
if err != nil {
panic(err)
}
if rows.Next() {
writer := csv.NewWriter(out)
writer.Comma = '\t'
cols := make([]string, len(colNames))
processRow := func() {
err := rows.Scan(cols...)
if err != nil {
panic(err)
}
writer.Write(cols)
}
processRow()
for rows.Next() {
processRow()
}
writer.Flush()
}
return nil
}
このために、私はcannot use cols (type []string) as type []interface {} in function argument
(writer.Write(cols)
行で。
次にテストしました
readCols := make([]interface{}, len(colNames))
writeCols := make([]string, len(colNames))
processRow := func() {
err := rows.Scan(readCols...)
if err != nil {
panic(err)
}
// ... CONVERSION?
writer.Write(writeCols)
}
につながるpanic: sql: Scan error on column index 0: destination not a pointer
。
更新 2
私は独自にANisusのソリューションにたどり着きました。これは私が今使っているコードです。
func dumpTable(rows *sql.Rows, out io.Writer) error {
colNames, err := rows.Columns()
if err != nil {
panic(err)
}
writer := csv.NewWriter(out)
writer.Comma = '\t'
readCols := make([]interface{}, len(colNames))
writeCols := make([]string, len(colNames))
for i, _ := range writeCols {
readCols[i] = &writeCols[i]
}
for rows.Next() {
err := rows.Scan(readCols...)
if err != nil {
panic(err)
}
writer.Write(writeCols)
}
if err = rows.Err(); err != nil {
panic(err)
}
writer.Flush()
return nil
}