Получить доступные соединения PostGIS в PyQGIS

11

Могу ли я получить доступные соединения с базами данных PostGIS в PyQGIS? Я хотел бы предоставить список доступных db-соединений, а затем список таблиц в пользовательском интерфейсе моего плагина.

Я проверил поваренную книгу, но не могу найти способ продвинуться с этим.

Томас Беккер
источник

Ответы:

12

Чтобы получить необходимую информацию, вам нужно использовать QSettingsкласс. При этом используется иерархическая структура, такая как реестр Windows. Если у вас последняя версия QGIS, вы можете увидеть эту иерархию, используя Настройки> Параметры> Дополнительно

Следующий код работает из консоли Python. Я не пробовал это из плагина или вне QGIS, поэтому в этих случаях может потребоваться дополнительная работа.

Чтобы увидеть иерархию, используйте это в консоли Python QGIS ...

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

Вывод дает некоторые подсказки ...

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

Таким образом, вы можете получить подробную информацию о подключении к базе данных, отфильтровывая префикс PostgreSQL / Connections /

Так что в этом случае у меня есть соединение под названием GEODEMO, я могу получить имя пользователя, например, так ...

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

Если у вас есть база данных, вы можете получить список таблиц, используя класс 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()

Обратите внимание, что порт должен быть строкой, а не числом.

Стивен Кей
источник
1
Спасибо, это отлично работает для меня в плагине, и в основном никаких настроек не потребовалось. Хотя одна вещь ... При приведении возвращаемого значения qs.value ("PostgreSQL / connections / GEODEMO / port") в строку, последний uri.setConnection пожаловался на порт! Не нужно приводить в строку. нормальное возвращаемое значение как число достаточно хорошо. Кроме того, процедура предполагает, что имя пользователя и пароль сохраняются при подключении к базе данных. Здесь лучше проверить «saveUsername» и «savePassword», чтобы создать возможность для пользовательского ввода в случае, если одно из возвращаемых значений «false».
Томас Беккер
7

Мой ответ будет почти таким же, как и предыдущий, но вы можете избежать зацикливания всех настроек и получать только соединения PostgreSQL с

from PyQt4.QtCore import QSettings

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

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

s.endGroup()
ThomasG77
источник
Да, это работает и отвечает на вопрос. Мне нужно было более общее решение, чем только соединения с PostgreSQL, которые нельзя было найти из первоначального вопроса. Тем не менее, полезно знать о группировке!
Томас Беккер