2016-03-22 5 views
1

Ich habe eine Liste von UUID-Zeichenfolgen, die ich verwenden möchte, um eine Abfrage zu filtern. Ich kann die Abfrage-Schleife in meiner Liste über Elemente wie so zu arbeiten, wenn ich:Go Wählen Sie unter Verwendung einer Liste von UUID-Zeichenfolgen

for i, fileUID := range fileUIDs { 
    db.Exec("DELETE FROM files WHERE uid = $1::uuid", fileUID) 
} 

Aber ich mag es erhalten arbeiten, um die Liste:

db.Exec("DELETE FROM files WHERE uid IN $1::uuid[]", fileUIDs) 

Ist das möglich? Ich kann es nicht funktionieren lassen.

habe ich versucht, die Lösung in How to execute an IN lookup in SQL using Golang? aber ich bekomme Fehler wie pq: syntax error at or near "," wenn Ebene ? oder pq: syntax error at or near "::" verwenden, wenn ?:uuid verwenden. Ich habe folgendes benutzt:

fileUIDArgs := make([]interface{}, len(fileUIDs)) 
for i, fileUID := range fileUIDs { 
    fileUIDArgs[i] = interface{}(fileUID) 
} 
//also tried using "?::uuid" 
myPsql := "DELETE FROM files WHERE uid IN (" + "?" + strings.Repeat(",?", len(uidStrings)-1) + ")" 
db.Exec(myPsql, fileUIDArgs...) 
+0

Mögliches Duplikat von [Wie führe ich eine IN-Suche in SQL mit Golang aus?] (Http://stackoverflow.com/questions/20271123/how-to-execute-an-in-lookup-in-sql-using- golang) –

+0

Dieser Teil bricht 'IN (","? "+'. Das Komma ist außerhalb der Zeichenkette. Versuch 'IN (?" + ' –

+0

) Entschuldigung, das war ein Kopierfehler, der in der Frage behoben wurde. –

Antwort

2

Mit fmt. Stellen Sie sicher, dass Ihre UUIDs keine SQL-injection enthalten.

ary := []string{ 
    "1442edc8-9e1f-4213-8622-5610cdd66790", 
    "0506ca17-d254-40b3-9ef0-bca6d15ad49d", 
    "e46f3708-6da5-4b82-9c92-f89394dffe5d", 
    "fb8bf848-73a2-4253-9fa3-e9d5e16ef94a", 
    "84691fa5-3391-4c02-9b16-82389331b7ac", 
    "adba3c9d-b4ab-4e62-a650-414970645be7", 
} 
query := fmt.Sprintf(`DELETE FROM files WHERE uid IN ('%s'::uuid);`, 
      strings.Join(ary, "'::uuid,'")) 
db.Exec(query) // etc 

play.golang.org


Rid aus potenziellen SQL-Injektionen:

ary := []string{ /* list of uuids */ } 
query := `DELETE FROM files WHERE uid IN (` 
aryInterfaces := make([]interface{}, len(ary)) 
for i, v := range ary { 
    query += "$" + strconv.FormatInt(int64(i+1), 10) 
    if i < len(ary)-1 { 
     query += "," 
    } 
    aryInterfaces[i] = v 
} 
query += ")" 
db.Exec(query, aryInterface...) 

play.golang.org


BONUS Postgresql verwendet $1, $2, $3 usw. anstelle von ?, ?, ?. Hier ist ein wenig helper function und here ist seine Proof of Concept.

+0

Vor dem Aufruf werden die UUIDs in 128-Bit-Ints umgewandelt und dann wieder in UID-Strings formatiert, also bin ich sicher, danke! –

+0

Dies ist die Antwort für Java und der Operator in wird in select verwendet, spielt aber keine Rolle für jede Sprache http://stackoverflow.com/questions/178479/preparedstatement-in-clause-alternatives – lofcek