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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.