如何解决«panic:sql:未知驱动程序“ postgres”(忘记导入?)»?

时间:2018-10-13 04:29:20

标签: postgresql go

我正在尝试使用GO将数据从.csv(固定宽度/表格形式)插入POSTGRES。

我所做的:

package main

import (
    "bufio"
    "database/sql"
    "encoding/csv"
    "encoding/json"
    "fmt"
    "io"
    "log"
    "os"
)

type Consumidor struct {
    CPF string   `json:"CPF"`
    Private  string   `json:"Private"`
    Incompleto  string   `json:"Incompleto"`
    Compras   *Compras `json:"Compras,omitempty"`
}

type Compras struct {
    DataUltimacompra  string `json:"DataUltimacompra"`
    TicketMedio string `json:"TicketMedio"`
    TicketUltimaCompra string `json:"TicketUltimaCompra"`
    LojaMaisFrequente string `json:"LojaMaisFrequente"`
    LojaUltimaCompra string `json:"LojaUltimaCompra"`
}

const (
    host     = "localhost"
    port     = 5432
    user     = "postgres"
    password = ""
    dbname   = "neoway"
)

func main() {
    csvFile, _ := os.Open("data.csv")
    reader := csv.NewReader(bufio.NewReader(csvFile))
    var dadosinsert []Consumidor
    for {
        line, error := reader.Read()
        if error == io.EOF {
            break
        } else if error != nil {
            log.Fatal(error)
        }
        dadosinsert = append(dadosinsert, Consumidor{
            CPF: line[0],
            Private:  line[1],
            Incompleto: line[2],
            Compras: &Compras{
                DataUltimacompra:  line[3],
                TicketMedio:  line[4],
                TicketUltimaCompra: line[5],
                LojaMaisFrequente:  line[6],
                LojaUltimaCompra: line[7],

            },
        })
    }
    peopleJson, _ := json.Marshal(dadosinsert)
    fmt.Println(string(peopleJson))

    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
        "password=%s dbname=%s sslmode=disable",
        host, port, user, password, dbname)
    db, err := sql.Open("postgres", psqlInfo)
    if err != nil {
        panic(err)
    }
    defer db.Close()

    sqlStatement := `
INSERT INTO base_teste (CPF,"PRIVATE","INCOMPLETO","DATA DA ÚLTIMA COMPRA","TICKET MÉDIO","TICKET DA ÚLTIMA COMPRA","LOJA MAIS FREQUÊNTE","LOJA DA ÚLTIMA COMPRA")
)
VALUES ($1, $2, $3, $4, $5, $6, 7$, 8$)
RETURNING id`
    id := 0
    err = db.QueryRow(sqlStatement, 30, "a", "b", "c").Scan(&id)
    if err != nil {
        panic(err)
    }
    fmt.Println("New record ID is:", id)
}

我跑步时出现此错误

  

[{“ CPF”:“ xxxxx”,“私人”:“ TRUE”,“不完整”:“ FALSE”,“比较”:{“ DataUltimacompra”:“ 12/10/2018”,“ TicketMedio”: “ 200”,“ TicketUltimaCompra”:“ 250”,“ LojaMaisFrequente”:“ 111.111.111-99”,“ LojaUltimaCompra”:“ 111.111.111-88”}}]   恐慌:sql:未知驱动程序“ postgres”(忘记导入?)

     

goroutine 1 [正在运行]:main.main()C:/ Users / Willian / Desktop / NEOWAY   PROJECT / neoway csv前缀宽度导入器/main.go:70 + 0xbed

     

以退出代码2完成的过程

1 个答案:

答案 0 :(得分:3)

您已经导入了sql/database,这是一个包含用于sql相关操作的通用接口的软件包。

由于它只是通用接口,因此您需要导入该接口的具体实现,在这种情况下,它是数据库驱动程序。

根据您的代码sql.Open("postgres", psqlInfo),我假设您正在使用postgresql数据库。有一些postgresql drivers for golang可用,其中之一是https://github.com/lib/pq驱动程序。因此,将其添加到import语句中。

package main

import (
    "bufio"
    "database/sql"
    "encoding/csv"
    "encoding/json"
    "fmt"
    "io"
    "log"
    "os"
    _ "github.com/lib/pq" // here
)

使用_字符导入的数据库驱动程序,因为我们不直接与包交互。相关的SO主题What does an underscore in front of an import statement mean in Golang?

有关golang sql的更多信息:https://godoc.org/database/sql


更新

  

现在我遇到此错误:GOROOT = C:\ Go #gosetup GOPATH = C:\ Users \ Willian \ go #gosetup C:\ Go \ bin \ go.exe build -o panic:pq:语法错误位于或在“ $” goroutine 1附近[运行]:main.main()

sqlStatement上,定义一个带有8个必需参数的SQL查询:$1, $2, $3, $4, $5, $6, $7, $8。这意味着必须在db.QueryRow上填写所有8个必需参数。

db.QueryRow(sqlQuery, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8).Scan(&id)

但是在您的代码中仅传递了4个参数:

db.QueryRow(sqlStatement, 30, "a", "b", "c").Scan(&id)

第七和第八个参数的语法也有误,应该为$7, $8而不是7$, 8$