Recuperar conexões PostGIS disponíveis no PyQGIS

10

Posso recuperar as conexões disponíveis com os bancos de dados PostGIS no PyQGIS? Gostaria de fornecer uma lista de conexões db disponíveis e, posteriormente, uma lista de tabelas na interface do usuário do meu plugin.

Eu verifiquei o livro de receitas, mas não consigo encontrar uma maneira de avançar mais com isso.

Thomas Becker
fonte

Respostas:

11

Para obter as informações desejadas, você precisa usar a QSettingsclasse Isso usa uma estrutura hierárquica, como o registro do Windows. Se você possui a versão mais recente do QGIS, pode ver essa hierarquia usando Configurações> Opções> Avançado

O código a seguir funciona no console Python. Eu não tentei isso em um plug-in ou fora do QGIS, portanto, alguns trabalhos adicionais podem ser necessários nesses casos.

Para ver a hierarquia, use isso no console python do QGIS ...

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

A saída dá algumas dicas ...

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

Para obter detalhes da conexão com o banco de dados, filtre o prefixo PostgreSQL / Connections /

Portanto, neste caso, eu tenho uma conexão chamada GEODEMO, posso obter o nome de usuário assim ...

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

Depois de ter um banco de dados em mente, você pode recuperar uma lista de tabelas usando a 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()

Observe que a porta deve ser uma sequência, não um número.

Steven Kay
fonte
11
Obrigado, isso funciona bem para mim em um plug-in, e basicamente nenhum ajuste foi necessário. Porém, uma coisa ... Ao converter o valor de retorno de qs.value ("PostgreSQL / connections / GEODEMO / port") para string, o último uri.setConnection reclamou da porta! Não é necessário converter para string. o valor de retorno normal como número é bom o suficiente. Além disso, o procedimento pressupõe que o nome de usuário e a senha sejam salvos com a conexão com o banco de dados. Aqui é melhor procurar por 'saveUsername' e 'savePassword' para criar a possibilidade de entrada do usuário, caso um dos valores de retorno seja 'false'.
Thomas Becker
7

Minha resposta será quase a mesma que a anterior, mas você pode evitar fazer um loop em todas as configurações e obter apenas as conexões do PostgreSQL com

from PyQt4.QtCore import QSettings

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

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

s.endGroup()
ThomasG77
fonte
Sim, isso funciona e responde à pergunta. Eu precisava de uma solução mais geral do que apenas as conexões do PostgreSQL, que não eram recuperáveis ​​da pergunta inicial. No entanto, é bom saber sobre o agrupamento!
Thomas Becker