Recupera le connessioni PostGIS disponibili in PyQGIS


11

Posso recuperare le connessioni disponibili ai database PostGIS in PyQGIS? Vorrei fornire un elenco di connessioni db disponibili e successivamente un elenco di tabelle all'interno dell'interfaccia utente del mio plug-in.

Ho controllato il libro di cucina ma non riesco a trovare un modo per andare oltre.

Risposte:


12

Per ottenere le informazioni desiderate, è necessario utilizzare la QSettingsclasse. Questo utilizza una struttura gerarchica, come il registro di Windows. Se hai l'ultima versione di QGIS, puoi vedere questa gerarchia usando Impostazioni> Opzioni> Avanzate

Il codice seguente funziona dalla console Python. Non ho provato questo da un plugin o al di fuori di QGIS, quindi in questi casi potrebbe essere necessario un lavoro aggiuntivo.

Per vedere la gerarchia, usalo nella console di Python di QGIS ...

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

L'output fornisce alcuni suggerimenti ...

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

Quindi puoi ottenere i dettagli della connessione al database filtrando il prefisso PostgreSQL / Connections /

Quindi in questo caso ho una connessione chiamata GEODEMO, posso ottenere lo username in questo modo ...

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

Una volta che hai in mente un database, puoi recuperare un elenco di tabelle usando la classe 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()

Nota che la porta dovrebbe essere una stringa, non un numero.


1
Grazie, per me funziona benissimo in un plugin e praticamente non sono necessarie modifiche. Una cosa però ... Quando si esegue il cast del valore di ritorno di qs.value ("PostgreSQL / connections / GEODEMO / port") su stringa, quest'ultimo uri.setConnection si è lamentato della porta! Non è necessario eseguire il cast su stringa. il normale valore di ritorno come numero è abbastanza buono. Inoltre, la procedura presuppone che il nome utente e la password vengano salvati con la connessione al database. Qui è meglio controllare "saveUsername" e "savePassword" per creare la possibilità per l'input dell'utente nel caso in cui uno dei valori di ritorno sia "false".
Thomas Becker,

7

La mia risposta sarà quasi la stessa della precedente, ma puoi evitare di ripetere tutte le impostazioni e ottenere solo connessioni PostgreSQL con

from PyQt4.QtCore import QSettings

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

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

s.endGroup()

Sì, funziona e risponde alla domanda. Avevo bisogno di una soluzione più generale delle sole connessioni PostgreSQL, non recuperabili dalla domanda iniziale. Tuttavia, bello sapere del raggruppamento!
Thomas Becker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.