Récupérer les connexions PostGIS disponibles dans PyQGIS

11

Puis-je récupérer les connexions disponibles aux bases de données PostGIS dans PyQGIS? Je voudrais fournir une liste des connexions db disponibles, puis une liste de tables dans l'interface utilisateur de mon plugin.

J'ai vérifié le livre de cuisine mais je ne trouve pas de moyen d'aller plus loin.

Thomas Becker
la source

Réponses:

12

Pour obtenir les informations souhaitées, vous devez utiliser la QSettingsclasse. Cela utilise une structure hiérarchique, comme le registre Windows. Si vous avez la dernière version de QGIS, vous pouvez voir cette hiérarchie en utilisant Paramètres> Options> Avancé

Le code suivant fonctionne à partir de la console Python. Je n'ai pas essayé cela depuis un plugin ou en dehors de QGIS, donc un travail supplémentaire peut être requis dans ces cas.

Pour voir la hiérarchie, utilisez-la dans la console python QGIS ...

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

La sortie donne quelques indices ...

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

Ainsi, vous pouvez obtenir les détails de connexion à la base de données en filtrant le préfixe PostgreSQL / Connections /

Donc dans ce cas, j'ai une connexion appelée GEODEMO, je peux obtenir le nom d'utilisateur comme ça ...

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

Une fois que vous avez une base de données en tête, vous pouvez récupérer une liste de tables à l'aide de 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()

Notez que le port doit être une chaîne et non un nombre.

Steven Kay
la source
1
Merci, cela fonctionne bien pour moi dans un plugin, et fondamentalement aucun ajustement n'était nécessaire. Une chose cependant ... Lors de la conversion de la valeur de retour de qs.value ("PostgreSQL / connections / GEODEMO / port") en chaîne, ce dernier uri.setConnection s'est plaint du port! Il n'est pas nécessaire de transtyper en chaîne. la valeur de retour normale sous forme de nombre est assez bonne. En outre, la procédure suppose que le nom d'utilisateur et le mot de passe sont enregistrés avec la connexion à la base de données. Ici, il est préférable de vérifier «saveUsername» et «savePassword» pour créer la possibilité de saisie par l'utilisateur au cas où l'une des valeurs de retour est «false».
Thomas Becker
7

Ma réponse sera presque la même que la précédente, mais vous pouvez éviter de boucler tous les paramètres et d'obtenir uniquement des connexions PostgreSQL avec

from PyQt4.QtCore import QSettings

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

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

s.endGroup()
ThomasG77
la source
Oui, cela fonctionne et répond à la question. J'avais besoin d'une solution plus générale que les seules connexions PostgreSQL, qui n'était pas récupérable à la question initiale. Mais bon à savoir sur le groupement!
Thomas Becker