From d77104fc45ef9cc36a11d5b09dfa4decaf190e11 Mon Sep 17 00:00:00 2001 From: Etienne Trimaille Date: Wed, 12 Jun 2024 08:56:24 +0200 Subject: [PATCH] Modification Postgis, Exception et uniqueValues --- docs/postgis.md | 19 +++++++++++-------- docs/selection-parcours-entites.md | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/docs/postgis.md b/docs/postgis.md index 0d5bada..3343cb3 100644 --- a/docs/postgis.md +++ b/docs/postgis.md @@ -8,10 +8,11 @@ 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 ```python -import psycopg2 +import psycopg inspect_schema = "mon_schema" -connection = psycopg2.connect( + +connection = psycopg.connect( user="docker", password="docker", host="db", port="5432", database="gis" ) cursor = connection.cursor() @@ -35,20 +36,22 @@ 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;") +# Besoin d'échapper en utilisant "" si votre schéma ou table comporte des majuscules +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") +print(connection.tables("un_schema")) -# Afficher une table dans QGIS -connection.tableUri("schema", "table") +# Afficher une table dans QGIS, cela retourne une chaîne de caractère +# permettant de faire une source de données pour une QgsVectorLayer +print(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 +layer.loadDefaultStyle() # Si un style par défaut existe dans votre base PostgreSQL, avec la table layer_styles QgsProject.instance().addMapLayer(layer) # Charger le résultat d'un SELECT @@ -57,7 +60,7 @@ uri = QgsDataSourceUri(connection.uri()) uri.setTable('(SELECT * FROM schema.table)') uri.setKeyColumn('uid') -# Avec une geom +# Avec une geom si besoin uri.setGeomColumn('geom') layer = QgsVectorLayer(uri.uri(), 'Requête SELECT', 'postgres') diff --git a/docs/selection-parcours-entites.md b/docs/selection-parcours-entites.md index d5acca9..1c4c9d9 100644 --- a/docs/selection-parcours-entites.md +++ b/docs/selection-parcours-entites.md @@ -95,6 +95,14 @@ for dept in depts: print(" → OK") ``` +Si l'on souhaite parcourir automatiquement les départements existants, on peut récupérer les valeurs uniques. Pour cela, +il faut modifier deux lignes : + +```python +index = layer.fields().indexFromName("INSEE_DEP") +for dept in layer.uniqueValues(index): +``` + ## Boucler sur les entités à l'aide d'une expression L'objectif est d'afficher dans la console le nom des communes dont la population ne contient pas `NC`. @@ -239,7 +247,16 @@ recommandé car il masque d'autres erreurs : try: 10 / 2 except Exception: - print('Ceci est une division par zéro !') + print('Erreur inconnue') +``` + +```python +try: + 10 / 0 +except ZeroDivisionError: + print('Erreur, division par 0') +except Exception: + print('Erreur inconnue') ``` Il existe d'autres mots-clés en Python pour les exceptions comme `finally:` et `else:`.