我想使用psycopg2从Postgres中检索一个PostGIS点列作为python元组。
这证明非常困难。我很困惑,psycopg2不会自动读取Postgres point types(将PostGIS点几何图形设置为python元组)。
例如,我希望以下代码中的row['latlng_tuple']
是浮点数的python元组。
cursor.execute("SELECT \
( CAST (ST_X(latlng) AS double precision) \
, CAST (ST_Y(latlng) AS double precision) \
) \
AS latlng_tuple \
FROM my_table;"
for row in cursor:
print row['latlng_tuple']
相反,我发现上面的代码将row['latlng_tuple']
作为字符串返回。这与the way that the psycopg2 documentation describes the conversion between Postgres and python types一致。
为什么会这样?有没有办法让psycopg2将点作为python元组返回,可能使用自定义转换器/适配器,如here所述?
或者,有一种简单的方法可以将PostGIS点几何返回为python元组吗?我试过ppygis并发现它不起作用。
答案 0 :(得分:1)
问题中的SQL会返回composite record
type (...)
,并将其转换为text
。例如,使用原生double precision
类型:
import psycopg2
import psycopg2.extras
conn = psycopg2.connect(...)
cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
cursor.execute("SELECT (1.0::double precision, 2.0::double precision) AS db_tuple;")
for row in cursor:
print(repr(row['db_tuple'])) # '(1,2)'
因此,您无法在SQL中为Python构建元组。使用Python构建元组:
cursor.execute("SELECT 1.0::double precision AS x, 2.0::double precision AS y;")
for row in cursor:
xy_tuple = (row['x'], row['y'])
print(repr(xy_tuple )) # (1.0, 2.0)
要从PostGIS获取其他软件的数据,请使用geometry accessor或output functions。例如ST_X(geom)
将点几何的 x -coordinate返回为double precision
类型。
cursor.execute("SELECT ST_X(latlng) AS lng, ST_Y(latlng) AS lat FROM my_table;")
for row in cursor:
latlng_tuple = (row['lat'], row['lng'])
print(repr(latlng_tuple))
# (1.0, 2.0)
# (3.0, 4.0)
另外,不要将PostGIS的geometry(Point)
类型与PostgreSQL的point
类型混淆。他们是非常不同的。此外,像ppygis这样的软件包不需要从Python到PostGIS获取几何图形。