2014-11-03 25 views
10

Desidero essere in grado di scrivere una matrice di bigin in una tabella che sto utilizzando per la cronologia in Go. Purtroppo, non posso e quando faccio l'errore sql: converting Exec argument #1's type: unsupported type []int64, a slice viene lanciato. Ecco quello che sto facendo, a cura per brevità:Inserimento di un array in un database Postgresql in Golang

type Card struct { 
    cid int64 
} 

type Transaction struct { 
     tid, cardid int64 
     productids []int64 
     salepoint int 
     cardkey string 
} 

func logPurchase(card *Card, t *Transaction) { 
    _, err := db.Exec("INSERT INTO history VALUES ($1, $2, $3, $4)", rand.Int63(), t.productids, card.cid, t.salepoint); 
} 

Questa è la struttura della tabella che desidero inserire in: tid bigint primary key, productids bigint[] not null, cardid bigint not null, salepoint int

+1

sembra che tu abbia un valore in più nella tua lista valori. – jmaloney

+0

Buona presa, non sono sicuro di come sono riuscito a metterlo lì. Quel problema non esiste all'interno del codice sorgente in cui sto avendo questo problema. Aggiornato di conseguenza la domanda. – ShrekTheDinosaur

+0

I tipi di array sono specifici per Postgresql. Potrebbe essere necessario utilizzare una libreria su misura per postgresql, come ad esempio: https://github.com/go-pg/pg – dyoo

risposta

6

Implementare database/SQL/driver.Valuer con un tipo personalizzato :

type int64array []int64 

func (a int64array) Value() (driver.Value, error) { 
    // Format a in PostgreSQL's array input format {1,2,3} and return it as as string or []byte. 
} 
+1

ciao, bella risposta. Come puoi implementare il contrario? Qualsiasi funzione che devo implementare per eseguire l'array psql -> slice? – STE

+1

Per l'operazione inversa, è necessario implementare l'interfaccia 'database/sql.Scanner'. Per questo è necessario utilizzare un ricevitore puntatore. – andybalholm

+0

Sarebbe utile aggiungerlo alla tua risposta per riferimento, se vuoi - grazie comunque! – STE

7

Arrays sono supportati in github.com/lib/pq dal 2016 6 agosto La dichiarazione dell'OP può essere scritta come:

_, err := db.Exec(
    "INSERT INTO history VALUES ($1, $2, $3, $4)", 
    rand.Int63(), 
    pq.Array(t.productids), // <------- 
    card.cid, 
    t.salepoint, 
) 
Problemi correlati