¿Cómo realizar consultas SQL y obtener resultados de la consola QGIS python?


10

Estoy escribiendo un script de Python usando la API QGIS. Tengo que obtener resultados de la tabla de base de datos postgres. La tabla tiene un campo de geometría y otros campos que no son de geometría.

Quiero realizar consultas SQL en campos no geométricos y obtener resultados en mi código. ¿Como hacer esto? ¿Hay alguna clase para hacerlo?

Sé sobre la QgsDataSourceURIclase, pero hasta donde sé, solo obtiene resultados de los campos de geometría.


¿Qué es dict_cur = conn.cursor (cursor_factory = psycopg2.extras.DictCursor)? >>> import psycopg2 >>> psycopg2.extras me da un Traceback Traceback (la última llamada más reciente): Archivo "<input>", línea 1, en <module> AttributeError: el objeto 'module' no tiene atributo 'extras'
Jochen Schwarze

Respuestas:


14

1) Con PyQt4.QtSql: Gary Sherman muestra cómo consultar una tabla espacial en Crear una conexión PostgreSQL a partir de una fuente de datos de capa 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

Y puede abrir todas las otras tablas / vistas (espaciales o no espaciales) de manera similar:

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) O puede usar el módulo Python estándar para 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]}')

Con una tabla o vista no espacial y el resultado como un diccionario:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.