程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了将“ SELECT *”列读入[]字符串中大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决将“ SELECT *”列读入[]字符串中?

开发过程中遇到将“ SELECT *”列读入[]字符串中的问题如何解决?下面主要结合日常开发的经验,给出你关于将“ SELECT *”列读入[]字符串中的解决方法建议,希望对你解决将“ 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希望根据其类型ScanRows“填充”字段中使用字符串数组和方法。因为我之前不知道表,所以我不知道有多少列以及它们的类型。

这是我在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 argumentwriter.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,请注明来意。