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

2021-11-28  本文已影响0人  barriers

本文为将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
}
上一篇下一篇

猜你喜欢

热点阅读