2016-04-06 8 views
0

Mein Code führt eine einfache SQL-Abfrage aus, um einige WKB-Geometrie in WKT zu konvertieren. Ich bekomme meine WKB-Geometrie von einer URL-Anfrage. Der Code sieht wie folgt aus:Syntaxfehler mit psycopg SQL-Abfrage über eine WKB-Zeichenfolge

url = 'http://..........' 
response = urllib2.urlopen(url).read() 
responseJson = json.loads(response) 
coordWKB = responseJson['wkb_geometry'] 
print(coordWKB) 
cur.execute("SELECT ST_AsText(" + coordWKB + ")") 

coordWKB wie folgt aussieht:

'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........' 

Aber ich erhalte den folgenden Fehler:

psycopg2.ProgrammingError: syntax error at or near "A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC11................ 
LINE 1: ...000020E6100000010000000103000000010000001200000017A84D0F3992... 

Wenn ich den Code unten, damit er ausführen funktioniert:

cur.execute("select ST_AsText('0106000020E6100000010000000103000000010000001200000017A84D0F39925EC08.............')") 

I c Ich glaube nicht, herauszufinden, was mit der WKB nicht stimmt. Ich gebe die Anfrage weiter.

Antwort

1

Lesen Sie zuerst Understanding repr() function in Python. Der String coordWKB

'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........' 

beinhaltet nicht die einfachen Anführungszeichen, es ist nur, wie Sie Ihre Python-Interpreter zeigt String-Werte für Ihre Bequemlichkeit.

SELECT ST_AsText(0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........) 

It:

"'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........'" 

im Auge

cur.execute("SELECT ST_AsText(" + coordWKB + ")") 

die resultierende SQL wird angegeben mit: Wenn es die einfachen Anführungszeichen tat enthalten, dann würde es als angezeigt werden sollte offensichtlich sein, dass das falsch ist. Als nächstes sollten Sie die Geschichte von little Bobby Tables und "the problem with the query parameters" lesen. Sie sollten niemals Werte in Ihre SQL-Abfrage einfügen, indem Sie Strings verketten. Das öffnet die Türen für SQL injection. Die Werte müssen ordnungsgemäß maskiert werden, damit keine zusätzliche SQL in Ihre Abfrage eingefügt werden kann. Das ist ein Job für Ihre DB-API und Sie müssen ihn nur mit placeholders anweisen. Von basic usage of psycopg2:

# Pass data to fill a query placeholders and let Psycopg perform 
# the correct conversion (no more SQL injections!) 
>>> cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", 
...  (100, "abc'def")) 

Sie beachten, dass Sie die Query-String selbst nicht formatieren, sondern den Wert Tupel als Argument an cur.execute passieren. Auf diese Weise sollte Ihre ursprüngliche Abfrage geschrieben werden als:

cur.execute("SELECT ST_AsText(%s)", (coordWKB,)) 
+0

Vielen Dank, das war genau die Hilfe/Klarheit, die ich suchte. –