Wie führe ich SQL-Abfragen durch und erhalte Ergebnisse von der QGIS-Python-Konsole?

10

Ich schreibe ein Python-Skript mit der QGIS-API. Ich muss Ergebnisse aus der Postgres-Datenbanktabelle erhalten. Die Tabelle enthält Geometriefelder und andere Nichtgeometriefelder.

Ich möchte SQL-Abfragen für Felder ohne Geometrie ausführen und Ergebnisse in meinem Code erhalten. Wie macht man das? Gibt es eine Klasse dafür?

Ich kenne mich mit QgsDataSourceURIKlasse aus, aber soweit ich weiß, werden nur Ergebnisse aus Geometriefeldern erzielt.

M Omayr
quelle
Was ist dict_cur = conn.cursor (cursor_factory = psycopg2.extras.DictCursor)? >>> psycopg2 importieren >>> psycopg2.extras gibt mir einen Traceback Traceback (letzter Aufruf zuletzt): Datei "<input>", Zeile 1, in <module> AttributeError: 'module'-Objekt hat kein Attribut' extras '
Jochen Schwarze

Antworten:

14

1) Mit PyQt4.QtSql: Gary Sherman zeigt, wie eine räumliche Tabelle beim Erstellen einer PostgreSQL-Verbindung aus einer QGIS-Layer-Datenquelle abgefragt wird :

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

Und Sie können alle anderen Tabellen / Ansichten (räumlich oder nicht räumlich) auf ähnliche Weise öffnen:

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) Oder Sie können das Standard-Python-Modul für PostgreSQL / PostGIS verwenden: 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]}')

Mit einer nicht räumlichen Tabelle oder Ansicht und dem Ergebnis als Wörterbuch:

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
Gen
quelle
1

Dies hängt davon ab, welche Datenbank Sie verwenden. Wenn es sich um Postgresql handelt, müssen Sie die PostgreSQL + Python-Bibliothek psycopg2 installieren und importieren

zur Installation verwenden:

pip install psycopg2

oder:

easy_install install psycopg2

Befolgen Sie dieses Tutorial oder die Grundlagen

Unter dem Radar
quelle