Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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é ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 26 August 2022 16:24

cllemendavvid
Juste Inscrit !
Date d'inscription: 21 Sep 2020
Messages: 6

QGIS: creer une table depuis un script python

Bonsoir à tous
Je suis novice en python

je souhaite simplement transvaser sur Qgis un résultat récupéré depuis une requête Postgresql
le résultat doit être une table Qgis


Pour cela je voudrais écrire un script python

Après l'import des différents modules
je passe d'abord par une connexion à une base de données Postgresql
puis je créer une couche vecteur
le but ensuite est de transvaser le résultat de la requête Sql
vers la couche Qgis

J'ai récupéré le début d'un ancien code, ça donne ceci


Code:

import psycopg2
import psycopg2.extras
import os
from qgis.core import *
from qgis.utils import iface
from PyQt4.QtCore import*
import processing
 
Host = serveur
DBname = bdd
schema = Schema
User = login
Password = mot_de_passe
Folder=Dossier
 
conn_string = "host='"+Host+"' dbname='"+DBname+"' user='"+User+"' password='"+Password+"'"
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
 
 
uri1='None'
EtiQuet = QgsVectorLayer(uri1,"EtiQuet","memory")
pr = EtiQuet.dataProvider()
EtiQuet.startEditing()
pr.addAttributes([QgsField("section",QVariant.String),QgsField("code_cb",QVariant.String),QgsField("capacite",QVariant.Int),QgsField("nb_etiq",QVariant.Int) ])
 
 
requete1 ="SELECT * FROM pm996.cb" #cette requete ne sera pas celle utilisée mais plus simple pour l'exemple
cursor.execute(requete1)
resultats = cursor.fetchall()

Puis je pense utiliser les fonctions suivantes
QgsFeature() | addFeatures


merci de votre aide

Hors ligne

 

#2 Fri 26 August 2022 17:27

p.jeremie
Participant assidu
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 427

Re: QGIS: creer une table depuis un script python

Bonjour,

Je ne peux pas vous répondre sur la partie python, mais je m'interroge : si votre requête SQL est assez complexe, pourquoi ne pas en faire une vue dans postgres, que vous pourriez récupérer dans QGIS ? Si votre enquête est assez simple, peut être est-il possible de la paramétrer directement dans QGIS soit via le constructeur de requête pour votre couche source, soit via une couche virtuelle.

Hors ligne

 

#3 Mon 29 August 2022 17:18

cllemendavvid
Juste Inscrit !
Date d'inscription: 21 Sep 2020
Messages: 6

Re: QGIS: creer une table depuis un script python

Bonjour

merci d'avoir répondu

p.jeremie :

pourquoi ne pas en faire une vue dans postgres,


la vue, oui c'est une bonne idée, à vrai dire, j'ai pas accès à Postgres
et ensuite la table est une liste que l'on récupère une seule fois donc
le script est tout aussi adapté je pense


Et vue que Python est bien utile sur Qgis c'est l'occasion d'en apprendre un petit peu :)

CD

Hors ligne

 

#4 Tue 06 September 2022 11:49

cllemendavvid
Juste Inscrit !
Date d'inscription: 21 Sep 2020
Messages: 6

Re: QGIS: creer une table depuis un script python

Bonjour

finalement j'ai trouvé , voici la solution


Code:

...
cursor = conn.cursor()

uri1='None'
EtiQuet = QgsVectorLayer(uri1,"EtiQuet","memory")
pr = EtiQuet.dataProvider()
EtiQuet.startEditing()
pr.addAttributes(\
[ QgsField("section",QVariant.String),QgsField("code_cb",QVariant.String),QgsField("capacite",QVariant.Int),QgsField("nb_etiq",QVariant.Int) ])


requete1 = "Create.."

cursor.execute(requete1)
resultats = cursor.fetchall()

for i in range (0, len(resultats)):
    feat=QgsFeature()
    feat.setAttributes( [resultats[i][0], resultats[i][1],resultats[i][2],resultats[i][3] ])
    pr.addFeatures([feat])
    EtiQuet.commitChanges() 

layer_sp=QgsMapLayerRegistry.instance().addMapLayer(EtiQuet)

QgsVectorFileWriter.writeAsVectorFormat(layer_sp, Dossier + '\\'+schema+'.xlsx', 'utf8', None, 'XLSX')

conn.commit()
cursor.close()
conn.close()

fetchall --> vers une liste 2D "resultats"
puis une boucle pour ajouter les éléments dans un objet QgsFeature()

Hors ligne

 

Pied de page des forums

Powered by FluxBB