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.

M Omayr
la source
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
gène
la source
1

Cela dépend de la base de données que vous utilisez. S'il s'agit de Postgresql, vous devez installer et importer psycopg2 la bibliothèque PostgreSQL + Python

pour installer utiliser:

pip install psycopg2

ou:

easy_install install psycopg2

Suivez ce tutoriel , sinon, pour les bases

Sous le radar
la source