#1 Tue 07 February 2023 15:56
- passby
- Participant occasionnel
- Date d'inscription: 1 Sep 2022
- Messages: 11
QGIS/PyQgis: Verifier si une couche est vide
Bonjour
Je suis sur la version 2.14 de Qgis
Je souhaite vérifier si la couche crée par le script est vide
puis, si non, l'ajouter à mon projet
voici le code essayé :
Code:
[..] requete1 ="(SELECT [...])" uri.setDataSource("", requete1, geom, "", "code_st") vlayer = QgsVectorLayer(uri.uri(),"couche1","postgres") if not vlayer.isValid: print('La couche n est pas valide') else: if requete1[0][1] is None: print('La requete ne renvoit aucun resultat') else: QgsMapLayerRegistry.instance().addMapLayer(vlayer) print('Couche ajoutee au projet')
L'erreur remontée :
IndexError: string index out of range
Le tableau requete1 est vide donc la première ligne du tableau n'existe pas.
L'erreur semble logique.
Je ne sais pas comment procéder pour avancer
merci d'avance pour vos réponses
Hors ligne
#2 Thu 09 February 2023 13:45
- zutix
- Participant actif
- Date d'inscription: 19 Mar 2020
- Messages: 87
Re: QGIS/PyQgis: Verifier si une couche est vide
Si la requête, requete1 est vide, vous n'avez pas besoin de créer une couche n'est-ce pas ? Alors :
try:
# tenter de lire le 1er élément de requete1
# si tout va bien faire le traitement: couche,...
except:
# requête vide : pas de couche ni de traitement + print d'info éventuellement
Hors ligne
#3 Thu 09 February 2023 14:58
- passby
- Participant occasionnel
- Date d'inscription: 1 Sep 2022
- Messages: 11
Re: QGIS/PyQgis: Verifier si une couche est vide
Bonjour et merci
Oui c'est tout à fait ce que cherche à faire
Pour lire le 1er élément,
je ne sais pas comment coder :
j'ai essayé ce code sans succès.
Code:
cursor.execute(requete1) resultats = cursor.fetchall() if resultats[1][0] is None: print('Ne rien faire') else: print('Continuer')
TypeError: 'NoneType' object has no attribute '__getitem__'
=> j'en déduis que résultats est bien vide
Hors ligne
#4 Thu 09 February 2023 16:12
- zutix
- Participant actif
- Date d'inscription: 19 Mar 2020
- Messages: 87
Re: QGIS/PyQgis: Verifier si une couche est vide
requete1 ="(SELECT [...])"
# biensur il faut que requete1[x][y] existe dans la majorite des cas
try:
if not requete1[0][1] is None:
# traiter le cas echeant
except:
# requete1[0][1] non lu, peut-être vide
Hors ligne
#5 Fri 10 February 2023 09:45
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS/PyQgis: Verifier si une couche est vide
Hello,
Première remarque: qu'est ce que vous faites encore sur la version 2.14? (elle n'est plus maintenue depuis longtemps).
Ensuite, je pense que vous ne comprenez pas bien ce que vous faites.
cursor.fetchall vous donne une liste de tuple contenant les valeurs des lignes retournées par votre requête sql.
Lorsque vous écrivez requete1[0][1], vous cherchez à accéder au deuxième élément du premier élément de la variable requete1. Vous vous attendez donc à ce que requete1 contienne au moins un élément.
Mais si votre sql ne renvois aucune ligne, votre variable requête contiendra une liste vide.
donc vous devriez écrire (non testé mais vous comprendrez l'idée):
Code:
cursor.execute(requete1) resultats = cursor.fetchall() if resultats: # si la liste n'est pas vide bool(resultats) renvoi True for resultat in resultats: do_something() # faire quelque chose avec les données de la ligne renvoyée par la requête SQL else: print('La requête sql n'a pas renvoyé de résultat...')
Hors ligne
#6 Fri 10 February 2023 17:24
- passby
- Participant occasionnel
- Date d'inscription: 1 Sep 2022
- Messages: 11
Re: QGIS/PyQgis: Verifier si une couche est vide
Re Bonjour et merci
Je travail sous Qgis 2.14 car c'est la version que nous utilisons au bureau
et beaucoup d'outils ont été développés à l'époque
Malgré ce que j'avais écrit, je ne souhaite pas passer par le cursor si possible.
Code:
requete1 ="(SELECT [...])" # biensur il faut que requete1[x][y] existe dans la majorite des cas
Enfaite, dans la majorité des cas la requête ne renvoie pas de résultat
seulement lors d'une erreur de remplissage manuel d'un champs.
Donc il me faudrait juste créer une condition
if premier élément de requete1 est non null
#créer la couche
Mais je ne vois pas comment coder cette condition
Hors ligne
#7 Fri 10 February 2023 18:18
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS/PyQgis: Verifier si une couche est vide
ok, par rapport a votre exemple dans la question, requete1 est une chaine de caractère. Donc lorsque vous faites requete[0][1] vous essayer de recuperer le deuxième élément du premier élément de la chaine. Donc le deuxième élément de "(", cela n'a aucun sens.
Il faut plutôt chercher si la couche vlayer est valide et si elle contient au moins un élément.
Vous pouvez vous aider de la méthode featureCount() de QgsVectorLayer pour ça.
Hors ligne
#8 Mon 13 February 2023 09:25
- passby
- Participant occasionnel
- Date d'inscription: 1 Sep 2022
- Messages: 11
Re: QGIS/PyQgis: Verifier si une couche est vide
Ok, j'ai essayé avec la méthode
Code:
vlayer = QgsVectorLayer(uri.uri(),"couche1","postgres") if vlayer.featureCount()> 0: QgsMapLayerRegistry.instance().addMapLayer(vlayer) print('Couche ajoutee') else: print( 'La requete ne renvoie pas de resultat')
Seulement j'ai un "plantage dumpé" dès que je lance le script.
J'ai également essayé d'afficher via l'interface Python :
Code:
numb=vlayer.featureCount() print('numb')
Même chose ça plante.
Hors ligne
#9 Mon 13 February 2023 10:07
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS/PyQgis: Verifier si une couche est vide
Convertissez votre code en python2 pour commencer puisque vous êtes sur QGIS2.14.
Ca va être compliqué de vous aider, je n'ai pas de QGIS aussi vieux pour tester. En tout cas la syntaxe print('blabla') ne fonctionnera pas en python2.
Si vous avez un plantage dumpé, il y a de fortes chances que quelque chose ne soit pas bon avec vlayer. Avez vous vérifié la validité de la couche? Si vous la créé à la main via l'interface, cela fonctionne?
Hors ligne