Как решить «паника: sql: неизвестный драйвер« postgres »(забытый импорт?)»? - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь вставить данные в POSTGRES из .csv (предварительно фиксированной ширины / таблицы) с помощью GO.

Что я сделал:

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", "Private": "TRUE", "Incompleto": "FALSE", "Compras": {"DataUltimacompra":"12/10/2018", "TicketMedio": "200", "TicketUltimaCompra": "250", "LojaMaisFrequente": "111.111.111-99", "LojaUltimaCompra": "111.111.111-88"}}]паника: sql: неизвестный драйвер "postgres" (забытый импорт?)

маршрут 1 [выполняется]: main.main () C: / Users / Willian / Desktop / NEOWAY PROJECT / neoway csv импортер ширины с префиксом / main.go: 70 + 0xbed

Процесс завершен с кодом выхода 2

1 Ответ

0 голосов
/ 13 октября 2018

Вы импортировали sql/database, пакет содержит универсальный интерфейс для операции, связанной с sql.

Поскольку это всего лишь универсальный интерфейс , вам необходимо импортировать конкретную реализацию интерфейсав данном контексте это драйвер базы данных.

Из вашего кода: sql.Open("postgres", psqlInfo) я предполагаю, что вы используете базу данных postgresql.Для golang доступно несколько драйверов postgresql, одним из которых является https://github.com/lib/pq driver.Поэтому добавьте его в оператор импорта.

package main

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

Драйвер базы данных импортирован с символом _, поскольку мы не взаимодействуем с пакетом напрямую.Связанная тема SO Что означает подчеркивание перед оператором импорта на Голанге? .

Подробнее о golang sql: https://godoc.org/database/sql.


ОБНОВЛЕНИЕ

теперь у меня такая ошибка: GOROOT = C: \ Go #gosetup GOPATH = C: \ Users \ Willian \ go #gosetup C: \ Go \ bin \ go.exe build -o паника: pq: синтаксическая ошибка в или около $ $ goroutine 1 [выполняется]: main.main ()

В sqlStatement вы определяете SQL-запрос с 8 обязательными аргументами: $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$.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...