banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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

 

Pied de page des forums

Powered by FluxBB