PyQGIS में उपलब्ध PostGIS कनेक्शन को पुनः प्राप्त करें


11

क्या मैं PyGGIS में PostGIS डेटाबेस के लिए उपलब्ध कनेक्शन पुनः प्राप्त कर सकता हूं? मैं उपलब्ध डीबी-कनेक्शनों की एक सूची प्रदान करना चाहूंगा, और बाद में मेरे प्लगइन के यूआई के भीतर तालिकाओं की एक सूची।

मैंने रसोई की किताब की जाँच की, लेकिन इसके साथ आगे बढ़ने का कोई रास्ता नहीं खोज सका।

जवाबों:


12

आपके द्वारा वांछित जानकारी प्राप्त करने के लिए, आपको QSettingsकक्षा का उपयोग करने की आवश्यकता है । यह विंडोज़ रजिस्ट्री की तरह एक पदानुक्रमित संरचना का उपयोग करता है। यदि आपके पास QGIS का नवीनतम संस्करण है, तो आप सेटिंग> विकल्प> उन्नत का उपयोग करके इस पदानुक्रम को देख सकते हैं

निम्नलिखित कोड पायथन कंसोल से काम करता है। मैंने इसे एक प्लगइन या QGIS के बाहर से नहीं आज़माया है, इसलिए इन मामलों में कुछ अतिरिक्त काम करने की आवश्यकता हो सकती है।

पदानुक्रम को देखने के लिए, 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 / कनेक्शन / के लिए फ़िल्टर करके डेटाबेस कनेक्शन विवरण प्राप्त कर सकते हैं

तो इस मामले में मेरे पास 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' की जांच करना बेहतर है।
थॉमस बेकर

7

मेरा उत्तर लगभग पहले जैसा ही होगा, लेकिन आप सभी सेटिंग्स को लूप करने से बच सकते हैं और केवल साथ पोस्टग्रेएसक्यूएल कॉन्सेप्ट प्राप्त कर सकते हैं

from PyQt4.QtCore import QSettings

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

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

s.endGroup()

हां, यह काम करता है और सवाल का जवाब देता है। मुझे केवल PostgreSQL कनेक्शन की तुलना में अधिक सामान्य समाधान की आवश्यकता थी, जो प्रारंभिक प्रश्न से पुनर्प्राप्त करने योग्य नहीं था। हालाँकि, ग्रुपिंग के बारे में जानना अच्छा है!
थॉमस बेकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.