2017-11-03 3 views
0

Ich bekomme einen Fehler, den ich keine Korrektur im Internet sehen kann. Ich bin neu in go-lang und ich kann keinen Fehler in meiner SQL-Anweisung sehen. Ich führe eine Aktualisierungsabfrage in go-lang aus. Der Code lautet:golang sql: erwartet 0 Argumente, habe 1

sql = "UPDATE tablename SET id1='' WHERE id2=" +fmt.Sprint(v.acctId) 
_, err = db.Exec(sql, nil) 

id1 und id2 sind beide varchar. Ich lege die SQL-Anweisung in eine Zeichenfolge und führe sie dann aus. Ich habe versucht, eine der IDs zu entfernen, aber es zeigt immer noch den Fehler an. Außerdem habe ich festgestellt, dass der Wert von v.acctId aus irgendeinem Grund nicht immer gleich ist. Ich weiß nicht, warum das passiert, denn wenn ich die SQL-Anweisung im MySQL-Arbeitsbereich ausprobierte, funktioniert es gut.

+0

Sie sollten Parameter in Ihre Abfrage nicht so einfügen. Siehe die [SQL Go Wiki Seite] (https://github.com/golang/go/wiki/SQLInterface) zur korrekten Verwendung. –

+0

ist es der Teil mit Zeilen, err: = db.Query ("SELECT Name FROM Benutzer WHERE Alter = $ 1", Alter) –

+0

'db.Exec (" UPDATE Tabellenname SET ID1 = '' WHERE ID2 = $ 1 ", v. acctId) ' – mkopriva

Antwort

-1

db.Exec hat die folgende Signatur

func (db *DB) Exec(query string, args ...interface{}) (Result, error) 

Args ein varargs Parameter ist, was bedeutet, dass Sie so viele Daten setzen können, wie Sie möchten. Für jede Variable, die Sie an Exec übergeben, sollte jedoch ein "?" in Ihrer SQL-Abfrage. Der Grund dafür, dass Sie den Fehler erhalten, besteht darin, dass Sie ihn mit Null übergeben, wo Sie nichts weiterleiten sollten.

ändern

err = db.Exec(sql, nil) 

Um

err = db.Exec(sql) 

Alternativ können Sie Ihre Anfrage an folgende

sql = "UPDATE tablename SET id1='' WHERE id2=?" 

Refactoring Dann exec laufen wie so

err = db.Exec(sql, fmt.Sprint(v.acctId)) 
+0

der erste scheint das Problem behoben zu haben. Ich werde es akzeptieren, wenn ich mir bereits sicher bin. –

-1

Sie bekommen die Fehler, weil Sie in nil als zweites Argument übergeben Exec, während der Abfrage, da keine Parameter Platzhalter ($1 in Postgres, ? in mysql ich glaube) angegeben.

Statt so etwas wie diese

db.Exec("UPDATE tablename SET id1='' WHERE id2=?", v.acctId) 

auch tun, sollten Sie so gut wie nie Ihre Fragen konstruieren durch Verketten von Strings wie einer SQL-Injection führt. Verwenden Sie also bitte die param Platzhalter.

Für den Fall, dass Sie eine Abfrage ausführen möchten, die keine Parameter enthält, dann tun Sie, was Sie gerade tun nil als zweites Argument nicht übergeben.

db.Exec(sql) 
Verwandte Themen