When connecting to PostgreSQL/PostGIS using the OGR Python bindings is it possible to get non-spatial table names (i.e. OGR layers) from the connection?
Currently, doing:
conn = ogr.Open("PG: #params")
for layer in conn:
print layer.GetName()
Will only print the names of spatial tables, however I can access non-spatial tables by (for example) directly specifying the table name, e.g.:
layer = conn.GetLayerByName('non_spatial_table_name')
The OGR docs refer to the "PG_LIST_ALL_TABLES=YES" parameter, but I can't find how this links to API (let alone the Python SWIG bindings!).
2 Answers 2
You can execute any arbitrary SQL from the connection. For example, to get data from spatial_ref_sys
, which is a non-spatial table:
from osgeo import ogr
conn = ogr.Open('PG:dbname=postgis user=postgres')
sql = 'SELECT * FROM spatial_ref_sys LIMIT 10;'
for row in conn.ExecuteSQL(sql):
print('%s:%d | %s'%(row.auth_name, row.auth_srid, row.proj4text))
-
Thanks Mike, what I'm aiming for is to check whether a non-spatial table exists at runtime (i.e. checking table name against user input). I could use your method to query pg_tables by tablebname instead.Tomas– Tomas2012年01月23日 22:40:15 +00:00Commented Jan 23, 2012 at 22:40
-
For reference, it is possible to set GDAL configuration options using gdal.SetConfigOption().
To list all tables:
import osgeo.gdal as gdal
import osgeo.ogr as ogr
gdal.SetConfigOption("PG_LIST_ALL_TABLES", "YES")
conn = ogr.Open("PG: #params")
for layer in conn:
print layer.GetName()
# Will print all tables including non-spatial ones.
You can see further examples of gdal.SetConfigOption in the GDAL/OGR test suite PostGIS module: http://svn.osgeo.org/gdal/trunk/autotest/ogr/ogr_pg.py
-
gdal.SetConfigOption('MSSQLSPATIAL_LIST_ALL_TABLES', 'YES') for mssqlSteve– Steve2019年11月08日 00:12:54 +00:00Commented Nov 8, 2019 at 0:12