Como executar consultas SQL e obter resultados do console python do QGIS?


10

Estou escrevendo um script python usando a API QGIS. Eu tenho que obter resultados da tabela de banco de dados postgres. A tabela possui campo de geometria e outros campos que não são de geometria.

Eu quero executar consultas SQL em campos não-geométricos e obter resultados no meu código. Como fazer isso? Existe alguma classe para fazer isso?

Eu sei sobre QgsDataSourceURIclasse, mas, tanto quanto sei, só obtém resultados dos campos de geometria.


O que é dict_cur = conn.cursor (cursor_factory = psycopg2.extras.DictCursor)? >>> import psycopg2 >>> psycopg2.extras me dá um Traceback Traceback (última chamada mais recente): Arquivo "<input>", linha 1, em <module> AttributeError: o objeto 'module' não tem atributo 'extras'
Jochen Schwarze

Respostas:


14

1) Com PyQt4.QtSql: Gary Sherman mostra como consultar uma tabela espacial em Criando uma conexão PostgreSQL a partir de uma camada de dados QGIS Layer :

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

E você pode abrir todas as outras tabelas / visualizações (espaciais ou não espaciais) da mesma forma:

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 você pode usar o módulo Python padrão 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]}')

Com uma tabela ou exibição não espacial e o resultado como um dicionário:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.