Comment effectuer des requêtes SQL et obtenir des résultats à partir de la console python QGIS?


10

J'écris un script python à l'aide de l'API QGIS. Je dois obtenir les résultats de la table de base de données postgres. La table a un champ géométrique et d'autres champs non géométriques.

Je souhaite effectuer des requêtes SQL sur des champs non géométriques et obtenir des résultats dans mon code. Comment faire ça? Y a-t-il une classe pour le faire?

Je connais la QgsDataSourceURIclasse, mais pour autant que je sache, elle n'obtient que des résultats des champs de géométrie.


Qu'est-ce que dict_cur = conn.cursor (cursor_factory = psycopg2.extras.DictCursor)? >>> import psycopg2 >>> psycopg2.extras me donne un Traceback Traceback (dernier appel le plus récent): Fichier "<input>", ligne 1, dans <module> AttributeError: l'objet 'module' n'a pas d'attribut 'extras'
Jochen Schwarze

Réponses:


14

1) Avec PyQt4.QtSql: Gary Sherman montre comment interroger une table spatiale dans Création d'une connexion PostgreSQL à partir d'une source de données de couche QGIS :

from PyQt4.QtSql import *
layer = iface.activeLayer()
uri = QgsDataSourceURI()
uri.setConnection("localhost", "5432", "testpostgis", "me", "")
uri.setDataSource("public", "teststrati", "the_geom")
# add the layer to the canvas
vlayer = QgsVectorLayer(uri.uri(), "tot", "postgres")
# now query the table
db = QSqlDatabase.addDatabase("QPSQL");
db.setHostName(uri.host())
db.setDatabaseName(uri.database())
db.setPort(int(uri.port()))
db.setUserName(uri.username())
db.setPassword(uri.password())
db.open()
# query the table
query = db.exec_("""select * from teststrati""")
query.next()
query.value(0)
130
# etc read the documentation of QtSQL

Et vous pouvez ouvrir toutes les autres tables / vues (spatiales ou non spatiales) de la même manière:

db = QSqlDatabase.addDatabase("QPSQL")
db.setHostName("localhost")
db.setPort(5432)
# non spatial table or view
db.setDatabaseName("people")
db.setUserName("me")
db.setPassword("")
query = QSqlQuery(db)
query.exec_("select * from people;")
# etc.

2) Ou vous pouvez utiliser le module Python standard pour PostgreSQL / PostGIS: Psycopg2 :

import psycopg2
conn = psycopg2.connect("dbname='testpostgis'host='localhost' user='me'")
cur = conn.cursor()
sql = """SELECT "DIP_DIR","DIP", ST_AsGeoJSON(the_geom) from teststrati;"""
cur.execute(sql)
result = cur.fetchone()
print result
(130, 30, u'{"type":"Point","coordinates":[272070.600040999997873,155389.387920000008307]}')

Avec une table ou une vue non spatiale et le résultat sous forme de dictionnaire:

conn = psycopg2.connect("dbname='testpostgis'host='localhost' user='me'")  
dict_cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
dict_cur.execute("""SELECT * from people;""")
rec = dict_cur.fetchone()
rec.keys()
['name', 'id']
rec.values()
('Jon Doe',1)
# etc read the documentation of the module

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.