Отримайте доступні з'єднання 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 / з'єднання / GEODEMO / порт") на рядок, то останній 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()

Так, це працює і відповідає на запитання. Мені потрібно було більш загальне рішення, ніж лише підключення PostgreSQL, яке не вдалося отримати з початкового питання. Однак добре знати про групування!
Томас Бекер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.