Python 使用PyQGIS 3.10及更新版本获取PostGIS表列表

Python 使用PyQGIS 3.10及更新版本获取PostGIS表列表,python,postgis,qgis,Python,Postgis,Qgis,我必须用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: de

我必须用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之前,我使用了以下代码(在同一类中):


从3.10版开始,由于con.postgistdbconnector(self.uri)抛出错误,因此不再工作。获取表名的正确方法是什么?

花了一段时间才找到我的错误。上述代码未建立到数据库的连接。我后来在向项目添加图层时这样做了。但是,我必须添加以下行:

self.conn = QgsProviderRegistry.instance().providerMetadata('postgres').createConnection(self.uri.uri(),{})
返回tablelist的函数现在是:

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')) 康涅狄格州表
    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())