在PyQGIS中检索可用的PostGIS连接


11

我可以在PyQGIS中检索到PostGIS数据库的可用连接吗?我想提供一个可用的数据库连接列表,然后在我的插件的用户界面中提供一个表列表。

我检查了食谱,但找不到进一步的方法。

Answers:


12

要获取所需的信息,您需要使用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抱怨该端口!不需要强制转换为字符串。正常的返回值(数字)就足够了。此外,该过程还假定用户名和密码与数据库连接一起保存。在这里,最好检查“ saveUsername”和“ savePassword”,以在返回值之一为“ false”的情况下创建用户输入的可能性。
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.