[英]Get PostGIS table list with PyQGIS 3.10 and newer
我必須將一些帶有 PyQGIS 的 PostGIS 圖層加載到 QGIS 項目中。 在 QGIS 3.8 版之前,我有一個可行的解決方案。 使用以下代碼進行連接:
from qgis.core import QgsDataSourceUri, QgsVectorLayer, QgsDataSourceUri
import re
import time
import db_manager.db_plugins.postgis.connector as con
...
class PgConnection:
def __init__(self, host, dbname, port):
self.uri = QgsDataSourceUri()
self.host = host
self.dbname = dbname
self.port = port
self.authcfg = None
self.user = ''
self.passwd = ''
settings = QgsSettings()
settings.beginGroup('PostgreSQL/connections')
for connectionName in settings.childGroups():
if settings.value(f'{connectionName}/host') == host and \
settings.value(f'{connectionName}/database') == dbname:
self.authcfg = settings.value(f'{connectionName}/authcfg')
break
if self.authcfg is None:
self.uri.setConnection(self.host, port, self.dbname, None, None)
connInfo = self.uri.connectionInfo()
(success, user, passwd) = QgsCredentials.instance().get(connInfo, None, None)
if success:
self.uri.setPassword(passwd)
self.uri.setUsername(user)
else:
self.uri.setConnection(self.host, self.port, self.dbname, None, None, authConfigId=self.authcfg)
現在我需要從特定模式中獲取所有表。 在 QGIS 3.8 版之前,我為此使用了以下代碼(在同一類中):
def getPgTableNames(self, schema):
tablenames = con.PostGisDBConnector(self.uri)
return tablenames.getTables(schema)
從 3.10 版開始,這不再有效,因為 con.PostGisDBConnector(self.uri) 會引發錯誤。 獲取表名的正確方法是什么?
花了一段時間才發現我的錯誤。 上面的代碼沒有建立到數據庫的連接。 我后來在向項目中添加圖層時這樣做了。 但是我必須添加以下行:
self.conn = QgsProviderRegistry.instance().providerMetadata('postgres').createConnection(self.uri.uri(),{})
返回表格列表的 function 現在是:
def getPgTableNames(self):
tablenames = self.conn.tables(self.schema)
return tablenames
以及完整的代碼:
from qgis.core import QgsDataSourceUri, QgsVectorLayer, QgsProviderRegistry, QgsProviderMetadata
import re
import time
#Klassendefinitionen
class PgConnection:
def __init__(self, host, dbname, port, schema):
self.uri = QgsDataSourceUri()
self.host = host
self.dbname = dbname
self.port = port
self.schema = schema
self.authcfg = None
self.user = ''
self.passwd = ''
pgProvider = QgsProviderRegistry.instance().providerMetadata('postgres')
settings = QgsSettings()
settings.beginGroup('PostgreSQL/connections')
for connectionName in settings.childGroups():
if settings.value(f'{connectionName}/host') == host and \
settings.value(f'{connectionName}/database') == dbname:
self.authcfg = settings.value(f'{connectionName}/authcfg')
break
if self.authcfg is None:
self.uri.setConnection(self.host, port, self.dbname, None, None)
connInfo = self.uri.connectionInfo()
(success, user, passwd) = QgsCredentials.instance().get(connInfo, None, None)
if success:
self.uri.setPassword(passwd)
self.uri.setUsername(user)
else:
self.uri.setConnection(self.host, self.port, self.dbname, None, None, authConfigId=self.authcfg)
self.conn = QgsProviderRegistry.instance().providerMetadata('postgres').createConnection(self.uri.uri(),{})
def getPgTableNames(self):
tablenames = self.conn.tables(self.schema)
return tablenames
#Verbindungsdaten angeben
host = 'some_host'
dbname = 'some_db'
schema = 'some_schema'
port = '1234'
# Verbindung zu Postgis aufbauen
uri = PgConnection(host,dbname, port, schema)
tableList = uri.getPgTableNames()
for t in tableList:
print (t.defaultName())
我只是使用連接名稱,它可以工作。 我有一個名為ftth
的連接,使用這樣的名稱,我可以從中獲取連接。
conn = QgsProviderRegistry.instance().providerMetadata('postgres').createConnection('ftth')
conn.tables()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.