Pobierz dostępne połączenia PostGIS w PyQGIS

11

Czy mogę pobrać dostępne połączenia z bazami danych PostGIS w PyQGIS? Chciałbym podać listę dostępnych połączeń db, a następnie listę tabel w interfejsie użytkownika mojej wtyczki.

Sprawdziłem książkę kucharską, ale nie mogę znaleźć sposobu, aby przejść dalej.

Thomas Becker
źródło

Odpowiedzi:

12

Aby uzyskać potrzebne informacje, musisz skorzystać z QSettingsklasy. Używa to hierarchicznej struktury, takiej jak rejestr systemu Windows. Jeśli masz najnowszą wersję QGIS, możesz zobaczyć tę hierarchię, wybierając Ustawienia> Opcje> Zaawansowane

Poniższy kod działa z konsoli Python. Nie próbowałem tego z wtyczki ani poza QGIS, więc w takich przypadkach może być wymagana dodatkowa praca.

Aby zobaczyć hierarchię, użyj tego w konsoli Pythona QGIS ...

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

Dane wyjściowe zawierają kilka wskazówek ...

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

Aby uzyskać szczegółowe informacje o połączeniu z bazą danych, filtruj przedrostek PostgreSQL / Connections /

Więc w tym przypadku mam połączenie o nazwie GEODEMO, mogę uzyskać nazwę użytkownika tak ...

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

Gdy masz już na myśli bazę danych, możesz pobrać listę tabel za pomocą klasy 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()

Pamiętaj, że port powinien być ciągiem, a nie liczbą.

Steven Kay
źródło
1
Dzięki, to działa dobrze dla mnie we wtyczce i w zasadzie nie było potrzeby dostosowywania. Jedna rzecz ... Podczas przesyłania wartości zwracanej przez qs.value („PostgreSQL / connection / GEODEMO / port”) na string, ten ostatni uri.setConnection narzekał na port! Nie trzeba rzutować na ciąg. normalna wartość zwracana jako liczba jest wystarczająco dobra. Ponadto procedura zakłada, że ​​nazwa użytkownika i hasło są zapisywane z połączeniem z bazą danych. W tym przypadku lepiej jest sprawdzić „saveUsername” i „savePassword”, aby stworzyć możliwość wprowadzania danych przez użytkownika w przypadku, gdy jedna z zwracanych wartości to „false”.
Thomas Becker
7

Moja odpowiedź będzie prawie taka sama jak poprzednia, ale można uniknąć zapętlenia wszystkich ustawień i uzyskania tylko połączeń PostgreSQL z

from PyQt4.QtCore import QSettings

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

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

s.endGroup()
ThomasG77
źródło
Tak, to działa i odpowiada na pytanie. Potrzebowałem bardziej ogólnego rozwiązania niż tylko połączenia PostgreSQL, którego nie można było odzyskać z początkowego pytania. Jednak warto wiedzieć o grupowaniu!
Thomas Becker