首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WKB字符串上的核心SQL查询语法错误

WKB字符串上的核心SQL查询语法错误
EN

Stack Overflow用户
提问于 2016-04-06 19:35:34
回答 1查看 232关注 0票数 0

我的代码执行一个简单的SQL查询,将一些WKB几何转换为WKT。我从url请求得到我的WKB几何图形。代码如下所示:

代码语言:javascript
复制
url = 'http://..........'
response = urllib2.urlopen(url).read()
responseJson = json.loads(response)
coordWKB = responseJson['wkb_geometry']
print(coordWKB)
cur.execute("SELECT ST_AsText(" + coordWKB + ")")

coordWKB看起来是这样的:

代码语言:javascript
复制
'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........'

但我得到了以下错误:

代码语言:javascript
复制
psycopg2.ProgrammingError: syntax error at or near "A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC11................   
LINE 1: ...000020E6100000010000000103000000010000001200000017A84D0F3992...

如果我执行下面的代码,它会工作:

代码语言:javascript
复制
cur.execute("select ST_AsText('0106000020E6100000010000000103000000010000001200000017A84D0F39925EC08.............')")

我似乎不知道我传递查询的WKB有什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-07 06:40:11

先读理解Python中的repr( )函数。字符串coordWKB

代码语言:javascript
复制
'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........'

不包括单引号,这正是python解释器为方便起见而显示字符串值的方式。如果它包含了单引号,那么它将显示为:

代码语言:javascript
复制
"'0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........'"

考虑到这一点

代码语言:javascript
复制
cur.execute("SELECT ST_AsText(" + coordWKB + ")")

生成的SQL将是:

代码语言:javascript
复制
SELECT ST_AsText(0106000020E6100000010000000103000000010000001200000017A84D0F39925EC083FC69A455C342400A1451BC48925EC0422CDC116B........)

显然,这是错误的。

接下来,您应该阅读小鲍比桌“查询参数的问题”的故事。不要通过连接字符串在SQL查询中包含值。这为SQL注入打开了大门。必须正确地转义这些值,这样才不会向查询中注入额外的SQL。这是DB的一项工作,您所要做的就是使用占位符来指导它。来自psycopg2的基本用法

代码语言:javascript
复制
# 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。这样,您的原始查询应该编写为:

代码语言:javascript
复制
cur.execute("SELECT ST_AsText(%s)", (coordWKB,))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36460766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档