使用go連接數(shù)據(jù)庫(kù)并導(dǎo)出文件

本文為將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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容