【问题标题】:Python and postgis, trying to figure out data typesPython 和 postgis,试图找出数据类型
【发布时间】:2017-02-01 16:32:35
【问题描述】:

我有一个从 python 运行的简单 sql,它从表中获取所有这些项目(主要是我很好奇的 mpoly)。这是几何。

cur = self.db.cursor()
cur.execute('select St_AsText(ST_Centroid(mpoly)) from swsite_cesiumentity')
allEntities = cur.fetchall()

那我就可以把信息弄出来了:

    print ' ***'
    print allEntities[0]
    print '----'

它会给我:

Row(st_astext='POINT(-87.266150008217 30.0857181963441)')

这很好,但是我尝试使用这些数据来获取与上述点相距甚远的所有点,我不知道如何使用我想要的 sql 查询中的类型使用。

试过这个:

for currentEntity in allEntities:
    print currentEntity
    cur2  = self.db.cursor()
    cur2.execute ('SELECT * FROM swsite_cesiumentity WHERE ST_Distance_Sphere(mpoly, ST_GeomFromText(' + currentEntity.st_astext + ')) <= radius_mi * 1609.34)) from swsite_cesiumentity')
    list = cur2.fetchall()
    print list

它不喜欢我提供的第二条 sql 语句:

pg.ProgrammingError: ERROR:  syntax error at or near "30.0857181963441"
LINE 1: ...ere(mpoly, ST_GeomFromText(POINT(-87.266150008217 30.0857181...
                                                             ^

C02RH2U9G8WM:ingest sth$ 

【问题讨论】:

标签: python postgis


【解决方案1】:

WKT 是文本,SQL 中的文本用单引号 'like this',因此:

sql = "SELECT ... ST_GeomFromText('" + wkt + "') ..."

会将 WKT 设为文本,即SELECT ... ST_GeomFromText('POINT(1 2)') ...

根据库(您从未说过——是 psycopg2 吗?),您应该改用参数化语句来避免文本格式错误和SQL injection 漏洞。

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 2022-01-24
    • 1970-01-01
    • 2013-01-09
    • 2015-11-10
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多