Rufen Sie verfügbare PostGIS-Verbindungen in PyQGIS ab

10

Kann ich die verfügbaren Verbindungen zu PostGIS-Datenbanken in PyQGIS abrufen? Ich möchte eine Liste der verfügbaren Datenbankverbindungen und anschließend eine Liste der Tabellen in der Benutzeroberfläche meines Plugins bereitstellen.

Ich habe das Kochbuch überprüft, kann aber keinen Weg finden, damit weiterzukommen.

Thomas Becker
quelle

Antworten:

11

Um die gewünschten Informationen zu erhalten, müssen Sie die QSettingsKlasse verwenden. Dies verwendet eine hierarchische Struktur wie die Windows-Registrierung. Wenn Sie über die neueste Version von QGIS verfügen, können Sie diese Hierarchie über Einstellungen> Optionen> Erweitert anzeigen

Der folgende Code funktioniert über die Python-Konsole. Ich habe dies nicht über ein Plugin oder außerhalb von QGIS versucht, daher sind in diesen Fällen möglicherweise zusätzliche Arbeiten erforderlich.

Verwenden Sie diese Option in der QGIS-Python-Konsole, um die Hierarchie anzuzeigen ...

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

Die Ausgabe gibt einige Hinweise ...

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

Sie können also Datenbankverbindungsdetails abrufen, indem Sie nach dem Präfix PostgreSQL / Connections / filtern

In diesem Fall habe ich eine Verbindung namens GEODEMO, ich kann den Benutzernamen so bekommen ...

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

Sobald Sie eine Datenbank im Auge haben, können Sie mithilfe der PostGisDBConnector-Klasse eine Liste von Tabellen abrufen .

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()

Beachten Sie, dass der Port eine Zeichenfolge und keine Zahl sein sollte.

Steven Kay
quelle
1
Danke, das funktioniert gut für mich in einem Plugin, und im Grunde waren keine Anpassungen erforderlich. Eines jedoch ... Beim Umwandeln des Rückgabewerts von qs.value ("PostgreSQL / connection / GEODEMO / port") in einen String beschwerte sich die letztere uri.setConnection über den Port! Es wird nicht benötigt, um auf String zu werfen. Der normale Rückgabewert als Zahl ist gut genug. Außerdem wird davon ausgegangen, dass Benutzername und Kennwort mit der Datenbankverbindung gespeichert werden. Hier ist es besser, nach 'saveUsername' und 'savePassword' zu suchen, um die Möglichkeit für Benutzereingaben zu schaffen, falls einer der Rückgabewerte 'false' ist.
Thomas Becker
7

Meine Antwort ist fast dieselbe wie die vorherige, aber Sie können vermeiden, alle Einstellungen zu wiederholen und nur PostgreSQL-Verbindungen mit zu erhalten

from PyQt4.QtCore import QSettings

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

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

s.endGroup()
ThomasG77
quelle
Ja, das funktioniert und beantwortet die Frage. Ich brauchte eine allgemeinere Lösung als nur PostgreSQL-Verbindungen, die von der ersten Frage nicht abrufbar waren. Gut zu wissen über die Gruppierung!
Thomas Becker