本文為將postresql中的數(shù)據(jù)導(dǎo)出為csv文件,并解決其中遇到的一些bug。
當(dāng)運(yùn)行程序報(bào)如下錯(cuò)誤時(shí)
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'
是因?yàn)槿鄙侔芾砉ぞ叩脑?br> 運(yùn)行如下命令
#proname為包管理的名字,自定義,該句表示初始化一個(gè)包管理文件(相當(dāng)于requirements.txt)
go mod init proname
此外運(yùn)行程序還需要裝一些包
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的連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng),xorm使用pq進(jìn)行連接數(shù)據(jù)庫(kù);
gota為數(shù)據(jù)處理包,類似于pandas,gonum為數(shù)據(jù)計(jì)算的包,類似于numpy
關(guān)于gota的使用詳情見https://github.com/go-gota/gota;
xorm為go中的連接數(shù)據(jù)庫(kù)的工具,并使用orm形式進(jìn)行操作數(shù)據(jù)庫(kù),類似于sqlalchemy,關(guān)于xorm的使用,詳情見https://blog.csdn.net/skh2015java/article/details/78814595;https://blog.csdn.net/feiwutudou/article/details/81317558;http://www.itdecent.cn/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("數(shù)據(jù)庫(kù)鏈接失敗", err)
return nil
}
engine.ShowSQL()
err = engine.Ping()
if err != nil {
log.Fatal(err)
return nil
}
fmt.Println("數(shù)據(jù)庫(kù)成功連接")
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("文件打開錯(cuò)誤")
}
defer fp.Close()
fmt.Println(good)
fmt.Println(goods[0].Id)
//解決導(dǎo)出csv亂碼問題,在文件開頭寫入U(xiǎn)TF-8 BOM
fp.WriteString("\xEF\xBB\xBF")
good.WriteCSV(fp)
//cmd中執(zhí)行GOOS=windows
//go build -o query.exe db/query.go
}