2016-08-01 6 views
2

Ich konvertiere ein bestehendes Projekt von MySQL nach Postgres. Es gibt einige rohe SQL-Literale im Code, die ? als einen Platzhalter verwenden, z.

SELECT 
    id 
    FROM 
    users 
    WHERE 
    name = ? 

Aber ich bekomme diese Fehlermeldung:

DB query error: error: operator does not exist: character varying = ? 

Ich will nicht alle von ? meine vorhandenen SQL konvertieren Postgres-Stil Operatoren wie $1.

Gibt es eine Möglichkeit, dass Knoten-Postgres stattdessen die Fragezeichen akzeptieren, oder ein Dienstprogramm, das Postgres-Stil-Params konvertieren kann?

Beachten Sie, dass eine Art Regex-basierter Hack nicht akzeptabel ist, da Fragezeichen in Anführungszeichen gesetzt werden können oder ein Backslash in jede Tiefe maskiert werden kann.

+1

Verwendung eines? in einer Abfrage ist nicht MySQL, sondern die App-Schicht, z.B. Java. Dies sollte höchstwahrscheinlich nicht geändert werden. Können Sie uns diese Abfrage im Zusammenhang mit dem Code zeigen? –

+0

Welche Version von Postgres verwenden Sie? Weil in der Dokumentation erwähnt wird, dass '?' (Https://www.postgresql.org/docs/9.1/static/ecpg-commands.html) sowie diese zufällige SO-Frage verwendet werden (http://stackoverflow.com/questions/10659737)/how-can-ich-benutze-eine-Abfrage-mit-Platzhalter-in-Anführungszeichen-perl-postgresql) –

+1

Was ist Knoten-Postgres, und warum ist es nicht in den Tags, wie es scheint, der Kern Ihres sein Frage? – joop

Antwort

1

Is there some way of having node-postgres accept the question marks instead?

NR. Und es gibt keine direkte Entsprechung zwischen ? und $1 Syntax, weil letztere die Wiederverwendung von Parametern impliziert, während ? es nicht erlaubt. Wenn Sie beispielsweise ? ? ? verwenden, bedeutet dies, dass Sie 3 Formatierungsparameter haben, während $1 $2 $2 impliziert, dass Sie zwei Formatierungsparameter haben.

Nicht wahrscheinlich, da es keine direkte Korrespondenz gibt, ist die Konvertierung nur einseitig möglich, was ein solches Dienstprogramm ziemlich nutzlos machen würde. Sie können alles selbst mit einem einzigen regulären Ausdruck ersetzen, indem Sie alle ? durch $ + index + 1 ersetzen.

I don't want to convert all my existing SQL from ? to postgres-style operators like $1 .

Sie haben nicht wirklich viel Auswahl in diesem. Es muss getan werden. Außerdem ist $1 viel flexibler als ?, aufgrund der Wiederverwendung von Parametern, plus optionale Erweiterungen. Beispielsweise erstreckt sich pg-promise sie sehr schön, mit verschiedenen Formatierungs Modifikatoren, die häufig benötigt werden: ^, ~, :json, :csv, etc ...

Note that some sort of Regex-based hack is not acceptable because question marks can be inside quotes, or backslash escaped to any depth.

Sie verbringen wahrscheinlich weniger Zeit, um Ihre SQL von Hand konvertieren, als die Zeit, um ein Dienstprogramm für die einfache richtige Konvertierung zu schreiben.