美文网首页
使用go连接数据库并导出文件

使用go连接数据库并导出文件

作者: barriers | 来源:发表于2021-11-28 00:45 被阅读0次

    本文为将postresql中的数据导出为csv文件,并解决其中遇到的一些bug。
    当运行程序报如下错误时

    no required module provides package github.com/go-xorm/xorm: go.mod file not found in current directory or any parent directory; see 'go help modules'
    

    是因为缺少包管理工具的原因
    运行如下命令

    #proname为包管理的名字,自定义,该句表示初始化一个包管理文件(相当于requirements.txt)
    go mod init proname
    

    此外运行程序还需要装一些包

    go mod init proname
    go get -u github.com/go-gota/gota/dataframe
    go get -u github.com/go-gota/gota/series
    go get github.com/lib/pq
    go get github.com/go-xorm/xorm
    

    pq为postgresql的连接数据库的驱动,xorm使用pq进行连接数据库;
    gota为数据处理包,类似于pandas,gonum为数据计算的包,类似于numpy
    关于gota的使用详情见https://github.com/go-gota/gota
    xorm为go中的连接数据库的工具,并使用orm形式进行操作数据库,类似于sqlalchemy,关于xorm的使用,详情见https://blog.csdn.net/skh2015java/article/details/78814595;https://blog.csdn.net/feiwutudou/article/details/81317558;https://www.jianshu.com/p/0bfd12157563

    package main
    import (
        "fmt"
        "os"
        _"github.com/lib/pq"
        "github.com/go-xorm/xorm"
        "github.com/go-gota/gota/dataframe"
        "log"
    )
    
    var config map[string] string = map[string] string {"user": "local", "pwd": "qda123", "host": "127.0.0.1", "port": "5432", "db": "test"}
    
    type Goods struct {
        Id int
        Name string
        Price int
        Year int
        Category string
        Description string
    }
    
    
    func createEngine() *xorm.Engine {
        configUrl := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
            config["host"], config["port"], config["user"], config["pwd"], config["db"])
        engine, err := xorm.NewEngine("postgres", configUrl)
        if err != nil {
            log.Fatal("数据库链接失败", err)
            return nil
        }
        engine.ShowSQL()
        err = engine.Ping()
        if err != nil {
            log.Fatal(err)
            return nil
        }
        fmt.Println("数据库成功连接")
        return engine
    }
    
    
    func queryDb(engine *xorm.Engine) []Goods {
        var goods []Goods
        engine.SQL("select id,name,price,year,category,description from goods;").Find(&goods)
        return goods
    }
    
    
    func main(){
        engine := createEngine()
        goods := queryDb(engine)
        good := dataframe.LoadStructs(goods)
        fp, err := os.Create("./商品.csv")
        if err != nil {
            fmt.Println("文件打开错误")
        }
        defer fp.Close()
        fmt.Println(good)
        fmt.Println(goods[0].Id)
        //解决导出csv乱码问题,在文件开头写入UTF-8 BOM
        fp.WriteString("\xEF\xBB\xBF")
        good.WriteCSV(fp)
        //cmd中执行GOOS=windows
        //go build -o query.exe db/query.go
    }
    

    相关文章

      网友评论

          本文标题:使用go连接数据库并导出文件

          本文链接:https://www.haomeiwen.com/subject/lqlcxrtx.html