我的代码执行一个简单的SQL查询,将一些WKB几何转换为WKT。我从url请求得到我的WKB几何图形。代码如下所示:
url = 'http://..........'
response = urllib2.urlopen(url).read()
responseJson = json.loads(response)
coordWKB = responseJson['wkb_geometry']
print(coordWKB)
cur.execute("SELECT ST_AsText(" + coordWKB + ")")coordWKB看起来是这样的:
'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........'但我得到了以下错误:
psycopg2.ProgrammingError: syntax error at or near "A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC11................
LINE 1: ...000020E6100000010000000103000000010000001200000017A84D0F3992...如果我执行下面的代码,它会工作:
cur.execute("select ST_AsText('0106000020E6100000010000000103000000010000001200000017A84D0F39925EC08.............')")我似乎不知道我传递查询的WKB有什么问题。
发布于 2016-04-07 06:40:11
先读理解Python中的repr( )函数。字符串coordWKB
'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........'不包括单引号,这正是python解释器为方便起见而显示字符串值的方式。如果它包含了单引号,那么它将显示为:
"'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........'"考虑到这一点
cur.execute("SELECT ST_AsText(" + coordWKB + ")")生成的SQL将是:
SELECT ST_AsText(0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........)显然,这是错误的。
接下来,您应该阅读小鲍比桌和“查询参数的问题”的故事。不要通过连接字符串在SQL查询中包含值。这为SQL注入打开了大门。必须正确地转义这些值,这样才不会向查询中注入额外的SQL。这是DB的一项工作,您所要做的就是使用占位符来指导它。来自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"))请注意,您不自己格式化查询字符串,而是将值元组作为参数传递给cur.execute。这样,您的原始查询应该编写为:
cur.execute("SELECT ST_AsText(%s)", (coordWKB,))https://stackoverflow.com/questions/36460766
复制相似问题