Python和postgis,试图弄清楚数据类型

时间:2017-02-01 16:32:35

标签: python postgis

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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