Recuperar conexiones PostGIS disponibles en PyQGIS

11

¿Puedo recuperar las conexiones disponibles a las bases de datos PostGIS en PyQGIS? Me gustaría proporcionar una lista de conexiones db disponibles y, posteriormente, una lista de tablas dentro de la interfaz de usuario de mi complemento.

Revisé el libro de cocina, pero no puedo encontrar una manera de llegar más lejos con esto.

Thomas Becker
fuente

Respuestas:

12

Para obtener la información que desea, debe usar la QSettingsclase. Esto utiliza una estructura jerárquica, como el registro de Windows. Si tiene la última versión de QGIS, puede ver esta jerarquía usando Configuración> Opciones> Avanzado

El siguiente código funciona desde la Consola Python. No lo he intentado desde un complemento o fuera de QGIS, por lo que podría ser necesario algún trabajo adicional en estos casos.

Para ver la jerarquía, use esto en la consola QGIS python ...

from PyQt4.QtCore import QSettings
qs = QSettings()
for k in sorted(qs.allKeys())
    print k

La salida da algunas pistas ...

.. snip ..
Plugins/searchPathsForPlugins
Plugins/valuetool/mouseClick
PostgreSQL/connections/GEODEMO/allowGeometrylessTables
PostgreSQL/connections/GEODEMO/database
PostgreSQL/connections/GEODEMO/dontResolveType
PostgreSQL/connections/GEODEMO/estimatedMetadata    
.. snip ...

Para que pueda obtener detalles de la conexión de la base de datos filtrando el prefijo PostgreSQL / Connections /

Entonces, en este caso tengo una conexión llamada GEODEMO, puedo obtener el nombre de usuario así ...

from PyQt4.QtCore import QSettings
qs = QSettings()
print qs.value("PostgreSQL/connections/GEODEMO/username")
>> steven

Una vez que tenga una base de datos en mente, puede recuperar una lista de tablas utilizando la clase PostGisDBConnector .

import db_manager.db_plugins.postgis.connector as con
from qgis.core import QgsDataSourceURI

uri = QgsDataSourceURI()
uri.setConnection("127.0.0.1", "5432", "database_name", "username", "password")
c = con.PostGisDBConnector(uri)
print c
print c.getTables()

Tenga en cuenta que el puerto debe ser una cadena, no un número.

Steven Kay
fuente
1
Gracias, eso funciona bien para mí en un complemento, y básicamente no se necesitaron ajustes. Sin embargo, una cosa ... Al convertir el valor de retorno de qs.value ("PostgreSQL / connections / GEODEMO / port") en una cadena, este último uri.setConnection se quejó del puerto. No es necesario lanzar en cadena. El valor de retorno normal como número es lo suficientemente bueno. Además, el procedimiento supone que el nombre de usuario y la contraseña se guardan con la conexión de la base de datos. Aquí es mejor verificar 'saveUsername' y 'savePassword' para crear la posibilidad de entrada del usuario en caso de que uno de los valores devueltos sea 'falso'.
Thomas Becker
7

Mi respuesta será casi la misma que la anterior, pero puede evitar repetir todas las configuraciones y solo obtener conexiones PostgreSQL con

from PyQt4.QtCore import QSettings

s = QSettings()
s.beginGroup("PostgreSQL/connections")

print s.allKeys()
print s.value("GEODEMO/username") 

s.endGroup()
ThomasG77
fuente
Sí, eso funciona y responde la pregunta. Necesitaba una solución más general que solo las conexiones PostgreSQL, que no era recuperable de la pregunta inicial. Sin embargo, es bueno saber acerca de la agrupación!
Thomas Becker