PyQGISで利用可能なPostGIS接続を取得する


10

PyQGISでPostGISデータベースへの利用可能な接続を取得できますか?利用可能なdb-connectionsのリストを提供し、続いて私のプラグインのui内のテーブルのリストを提供したいと思います。

クックブックをチェックしましたが、これをさらに進める方法が見つかりませんでした。

回答:


11

必要な情報を取得するには、QSettingsクラスを使用する必要があります。これは、Windowsレジストリのような階層構造を使用します。QGISの最新バージョンがある場合は、[設定]> [オプション]> [詳細設定]を使用してこの階層を表示できます。

次のコードは、Pythonコンソールから機能します。プラグインやQGISの外部からこれを試したことがないので、これらの場合には追加の作業が必要になる可能性があります。

階層を表示するには、これをQGIS Pythonコンソールで使用します...

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がポートについて不平を言っていました。文字列にキャストする必要はありません。数値として十分な通常の戻り値。また、この手順では、ユーザー名とパスワードがデータベース接続とともに保存されることを前提としています。ここで、戻り値の1つが「false」の場合にユーザー入力の可能性を作成するために、「saveUsername」と「savePassword」を確認することをお勧めします。
Thomas Becker

7

私の答えは前の答えとほとんど同じですが、すべての設定をループして、PostgreSQLの接続のみを取得することを回避できます

from PyQt4.QtCore import QSettings

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

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

s.endGroup()

はい、それは機能し、質問に答えます。最初の質問からは検索できなかったPostgreSQL接続のみよりも一般的な解決策が必要でした。ただし、グループ化について知っておくと便利です。
Thomas Becker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.