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.