Python 和 postgis,试图找出数据类型

Python and postgis, trying to figure out data types

我有一个简单的 sql I am 运行 from python 从 table 中获取所有这些项目(主要是我很好奇的 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$ 

WKT 是文本,SQL 中的文本进入 single-quotes 'like this',因此:

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

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

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