2016-05-23 9 views
0

Ich verwende Go, um eine Abfrage auf einer PostgreSQL-DB auszuführen. Beachten Sie, dass im DB id der Typ bigint ist.Vergleichen von Feld zu Platzhalter - PostgreSQL

db.Exec("UPDATE tags SET association_count = association_count - 1 WHERE id=?;", id) 

Wenn ich diesen Code ausführen, bekomme ich einen SQL-Fehler

operator does not exist: bigint =? 

Von dem, was ich sagen kann dies durch eine Typisierung Diskrepanz zwischen den id verursacht wird und die ?. Ich habe versucht, mit :: zu werfen, aber es wirft einen Fehler, und habe nichts darüber gefunden. Interessanterweise wird bei einem Leerzeichen wie id = ? ein allgemeiner Syntaxfehler ausgegeben. Irgendeine Idee, wie man das wirft oder umgeht?

+0

Es ist kein Typproblem. Das Problem ist, dass der Platzhalter nicht ersetzt wird oder der 'ID'-Variablenwert '? ' –

+0

Könnte das Problem das Semikolon sein? –

+0

@ClodoaldoNETo Was meinst du mit dem 'id' Variablenwert ist'? '? Wie Postgres weiß nicht, welche 'ID' es anschaut? – cfatt10

Antwort

3

Postgres verwendet $# für Platzhalter postgres docs

Wenn die vorbereitete Anweisung zu schaffen, durch die Position auf Parameter beziehen, $ 1, $ 2 verwendet wird, usw. Eine entsprechende Liste von Parameterdatentypen wahlweise festgelegt werden kann. Wenn der Datentyp eines Parameters nicht angegeben oder als unbekannt deklariert ist, wird der Typ aus dem Kontext abgeleitet, in dem der Parameter verwendet wird (falls möglich). Geben Sie bei der Ausführung der Anweisung die tatsächlichen Werte für diese Parameter in der EXECUTE-Anweisung an. Weitere Informationen hierzu finden Sie unter EXECUTE.

versuchen so

result, err := db.Exec(` 
    UPDATE tags 
    SET association_count = association_count - 1 
    WHERE id=$1;`, id 
) 

Hier ist, was result

UPDATE wie

aussieht: a_horse_with_no_name einen guten Punkt macht. Dies hängt davon ab, welche Client-Bibliothek Sie verwenden. Ich nahm an, es war pq da das für Postgres in Golang beliebt ist.

+2

Beachten Sie, dass der Kommentar aus dem Handbuch auf Anweisung innerhalb einer prozeduralen Sprache wie PL/pgSQL verweist. Die Platzhalterbehandlung von einer "Client" -Sprache wird durch den Sprachtreiber gehandhabt. In JDBC würde der Platzhalter _is_ '?' Und '$ 1' nicht funktionieren. In diesem Fall verwendet der Treiber für Go offenbar die gleiche Syntax wie das Backend. Aber das Zitat aus dem Handbuch bezieht sich nicht wirklich auf vorbereitete Aussagen aus einer Anwendungssprache –

+0

@a_horse_with_no_name Das ist ein guter Punkt. Ich nahm an, dass das OP pq benutzte, das Postgres '$ 1' Syntax nachahmt. – poopoothegorilla

+0

@poopoothegorilla ein weiterer kleiner Punkt: Sie brauchen ein Komma nach 'id' :) – Snowman

Verwandte Themen