2014-11-03 10 views
10

Chcę móc napisać tablicę bigints do tabeli, której używam dla historii w Go. Niestety, nie mogę i kiedy robię błąd, jest zgłaszany błąd sql: converting Exec argument #1's type: unsupported type []int64, a slice. Oto, co robię, edytowane za zwięzłość:Wstawianie tablicy do bazy danych Postgresql w 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); 
} 

Jest to struktura tabeli, które chciałbym wstawić do: tid bigint primary key, productids bigint[] not null, cardid bigint not null, salepoint int

+1

Wygląda na to, że masz dodatkową wartość na liście wartości. – jmaloney

+0

Dobry połów, nie jestem pewien, jak udało mi się to tam umieścić. Ten problem nie istnieje w kodzie źródłowym, w którym mam ten problem. Odpowiednio zaktualizowałem pytanie. – ShrekTheDinosaur

+0

Typy tablic są specyficzne dla PostgreSQL. Może być konieczne użycie biblioteki dostosowanej do postgresql, takiej jak: https://github.com/go-pg/pg – dyoo

Odpowiedz

6

Wdrożenie bazy danych/SQL/driver.Valuer z niestandardowego typu :

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

hi andy, fajna odpowiedź. Jak jednak możesz wprowadzić przeciwieństwo? Dowolna funkcja, którą muszę zaimplementować, aby wykonać tablicę psql -> slice? – STE

+1

Do operacji odwrotnej konieczne jest zaimplementowanie interfejsu 'database/sql.Scanner'. Do tego trzeba użyć odbiornika wskaźnika. – andybalholm

+0

Byłoby przydatne, aby dodać go do swojej odpowiedzi w celach informacyjnych, jeśli chcesz - dzięki! – STE

7

Arrays są obsługiwane w github.com/lib/pq od 2016 Aug 6. Oświadczenie OP można zapisać jako:

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