PyQGIS'te mevcut PostGIS bağlantılarını alma


11

PyQGIS'te PostGIS veritabanlarına mevcut bağlantıları alabilir miyim? Kullanılabilir db bağlantılarının bir listesini ve daha sonra eklentimin kullanıcı arayüzünde tabloların bir listesini sağlamak istiyorum.

Yemek kitabını kontrol ettim ama bununla ilgili daha fazla yol bulamıyorum.

Yanıtlar:


12

İstediğiniz bilgileri almak için QSettingssınıfı kullanmanız gerekir . Bu, Windows kayıt defteri gibi hiyerarşik bir yapı kullanır. QGIS'in en son sürümüne sahipseniz, bu hiyerarşiyi Ayarlar> Seçenekler> Gelişmiş'i kullanarak görebilirsiniz.

Aşağıdaki kod Python Konsolu'ndan çalışır. Bunu bir eklentiden veya QGIS dışından denemedim, bu nedenle bu durumlarda bazı ek çalışmalar gerekebilir.

Hiyerarşiyi görmek için bunu QGIS python konsolunda kullanın ...

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

Çıktı bazı ipuçları veriyor ...

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

Böylece, PostgreSQL / Connections / ön ekini filtreleyerek veritabanı bağlantısı ayrıntılarını alabilirsiniz.

Bu durumda GEODEMO adında bir bağlantım var, kullanıcı adını şöyle alabilirim ...

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

Aklınızda bir veritabanı olduğunda, PostGisDBConnector sınıfını kullanarak tabloların listesini alabilirsiniz .

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()

Bağlantı noktasının sayı değil, bir dize olması gerektiğini unutmayın.


1
Teşekkürler, bir eklenti benim için iyi çalışıyor ve temelde herhangi bir ayarlama gerekli değildi. Yine de bir şey ... qs.value ("PostgreSQL / connections / GEODEMO / port") dönüş değerini yayınlarken, uri.setConnection bağlantı noktası hakkında şikayet etti! Dizeye yayın yapmak gerekli değildir. sayı olarak normal dönüş değeri yeterince iyidir. Ayrıca yordam, kullanıcı adı ve parolanın veritabanı bağlantısıyla kaydedildiğini varsayar. Burada, dönüş değerlerinden birinin 'yanlış' olması durumunda kullanıcı girişi olasılığını oluşturmak için 'saveUsername' ve 'savePassword' öğelerini kontrol etmek daha iyidir.
Thomas Becker

7

Cevabım bir öncekiyle neredeyse aynı olacak, ancak tüm ayarları döngüye sokmayı ve yalnızca PostgreSQL bağlantılarını elde etmeyi önleyebilirsiniz.

from PyQt4.QtCore import QSettings

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

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

s.endGroup()

Evet, bu işe yarar ve soruyu cevaplar. İlk sorudan alınamayan sadece PostgreSQL bağlantılarından daha genel bir çözüme ihtiyacım vardı. Ancak, gruplama hakkında bilmek iyi!
Thomas Becker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.