Aller au contenu

PostGIS#

Psycopg#

En Python, il existe un package dédié à PostgreSQL, il s'agit de Psycopg. Il s'agit d'un package totalement indépendant de QGIS.

Exemple pour récupérer les tables présentes dans une base de données à l'aide de SQL

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import psycopg2

inspect_schema = "mon_schema"
connection = psycopg2.connect(
    user="docker", password="docker", host="db", port="5432", database="gis"
)
cursor = connection.cursor()
cursor.execute(
    f"SELECT table_name FROM information_schema.tables WHERE table_schema = '{inspect_schema}'"
)
records = cursor.fetchall()
print(records)

PyQGIS#

Depuis QGIS 3.16, il existe de plus en plus de méthodes dans la classe QgsAbstractDatabaseProviderConnection pour interagir avec une base de données PostGIS.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from qgis.core import QgsProviderRegistry

metadata = QgsProviderRegistry.instance().providerMetadata('postgres')
connection = metadata.findConnection("nom de la connexion PG dans votre panneau")

# Faire une requête SQL (ou plusieurs)
results = connection.executeSql("SELECT * FROM schema.table;")
print(results)

# Créer un schéma
connection.createSchema("mon_nouveau_schema")

# Lister les tables
connection.tables("un_schema")

# Afficher une table dans QGIS
connection.tableUri("schema", "table")

layer = QgsVectorLayer(connection.tableUri("schema", "table"), "Ma table", "postgres")
layer.loadDefaultStyle()  # Si un style par défaut existe dans votre base PG
QgsProject.instance().addMapLayer(layer)

# Charger le résultat d'un SELECT
# Notons l'usage des parenthèses autour du SELECT
uri = QgsDataSourceUri(connection.uri())
uri.setTable('(SELECT * FROM schema.table)')
uri.setKeyColumn('uid')

# Avec une geom
uri.setGeomColumn('geom')

layer = QgsVectorLayer(uri.uri(), 'Requête SELECT', 'postgres')

Exemple d'extension

Si besoin, l'extension PgMetadata utilise exclusivement l'API "Base de données PG" de QGIS.