Python 使用PyQGIS 3.10及更新版本获取PostGIS表列表
我必须用PyQGIS将一些PostGIS层加载到QGIS项目中。在QGIS版本3.8之前,我有一个有效的解决方案。通过以下代码进行连接: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
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())