2016-04-06 8 views
0

私のコードは、単純なSQLクエリを実行して、WKBジオメトリをWKTに変換します。私は、WKBジオメトリをURLリクエストから取得します。コードは次のようになります。psycopgの構文エラーWKB文字列に対するSQLクエリ

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

しかし、私は次のエラーを取得::私はその下のコードを実行した場合

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

作品:

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

coordWKB

はこのようになります

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

Ic WKBに何が間違っているのか分からないようですが、私はその質問を渡しています。

答えて

1

最初に読み取ったUnderstanding repr() function in Python。文字列coordWKB

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

は、それがあなたのPythonインタプリタはあなたの便宜のために文字列の値を表示するだけの方法である単一引用符を、含まれていません。それは、単一引用符が含まれなかった場合、それは次のように表示されます:

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

与えられたこのことを念頭に

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

結果のSQLは次のようになります。

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

それこれが間違っていることは明らかです。

次に、little Bobby Tables"the problem with the query parameters"のストーリーを読んでください。文字列を連結してSQLクエリに値を含めないでください。それはSQL injectionのためのドアを開きます。追加のSQLをクエリに挿入できないように、値を適切にエスケープする必要があります。それはあなたのDB-APIの仕事であり、あなたがしなければならないことはplaceholdersで指示することだけです。

# 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")) 

あなたは、クエリ文字列を自分でフォーマットしますが、cur.executeの引数として値のタプルを通過しないことに注意してください:basic usage of psycopg2から。このようにして、元のクエリは次のように書く必要があります。

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

ありがとうございました。これは私が探していたヘルプ/明快さでした。 –