12 votos

Recuperar las conexiones PostGIS disponibles en PyQGIS

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

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

13voto

Mat Puntos 196

Para obtener la información que quieres, necesitas usar el QSettings clase. Utiliza una estructura jerárquica, como el registro de Windows. Si tienes la última versión de QGIS, puedes ver esta jerarquía usando Ajustes>Opciones>Avanzado

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

Para ver la jerarquía, usa esto en la consola pitón de QGIS...

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 ...

Así que puedes obtener los detalles de conexión de la base de datos filtrando el prefijo PostgreSQL/Conexiones/

Así que en este caso tengo una conexión llamada GEODEMO, puedo conseguir el nombre de usuario así...

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

Una vez que se tiene una base de datos en mente, se puede recuperar una lista de tablas usando el 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()

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

8voto

BWW Puntos 302

Mi respuesta será casi la misma que la anterior, pero puedes evitar hacer un bucle en todas las configuraciones y sólo 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()

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X