大佬教程收集整理的这篇文章主要介绍了将“ SELECT *”列读入[]字符串中,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
为了Scan
将值直接转换为[]String
,您必须创建一个[]interface{}
指向字符串切片中每个字符串的切片。
在这里,您有一个适用的MysqL示例(只需更改sql.open
-command以匹配您的设置):
package main
import (
"fmt"
_ "github.com/go-sql-driver/MysqL"
"database/sql"
)
func main() {
db, err := sql.Open("MysqL", "user:pass@tcp(localhost:3306)/test?charset=utf8")
defer db.Close()
if err != nil {
fmt.Println("Failed to connect", err)
return
}
rows, err := db.@R_419_5962@(`SELECT 'one' col1, 'two' col2, 3 col3, NulL col4`)
if err != nil {
fmt.Println("Failed to run @R_419_5962@", err)
return
}
cols, err := rows.columns()
if err != nil {
fmt.Println("Failed to get columns", err)
return
}
// Result is your slice String.
rawResult := make([][]byte, len(cols))
result := make([]String, len(cols))
dest := make([]interface{}, len(cols)) // A temporary interface{} slice
for i, _ := range rawResult {
dest[i] = &rawresult[i] // Put pointers to each String in thE interface slice
}
for rows.Next() {
err = rows.Scan(dest...)
if err != nil {
fmt.Println("Failed to scan row", err)
return
}
for i, raw := range rawResult {
if raw == nil {
result[i] = "\\N"
} else {
result[i] = String(raw)
}
}
fmt.Printf("%#v\n", result)
}
}
我想编写一个Go程序,以使用将从数据库表中的行转储到csv文件中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)
在线。
然后我测试
@R_618_5875@ls := make([]interface{},len(colNames))
writeCols := make([]String,len(colNames))
processRow := func() {
err := rows.Scan(@R_618_5875@ls...)
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,err := rows.columns()
if err != nil {
panic(err)
}
writer := csv.NewWriter(out)
writer.Comma = '\t'
@R_618_5875@ls := make([]interface{},len(colNames))
for i,_ := range writeCols {
@R_618_5875@ls[i] = &writeCols[i]
}
for rows.Next() {
err := rows.Scan(@R_618_5875@ls...)
if err != nil {
panic(err)
}
writer.Write(writeCols)
}
if err = rows.Err(); err != nil {
panic(err)
}
writer.Flush()
return nil
}
以上是大佬教程为你收集整理的将“ SELECT *”列读入[]字符串中全部内容,希望文章能够帮你解决将“ SELECT *”列读入[]字符串中所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。