Bagaimana cara melakukan query SQL dan mendapatkan hasil dari konsol python QGIS?


10

Saya sedang menulis skrip python menggunakan QGIS API. Saya harus mendapatkan hasil dari tabel database postgres. Tabel memiliki bidang geometri dan bidang non-geometri lainnya.

Saya ingin melakukan query SQL pada bidang non-geometri dan mendapatkan hasil dalam kode saya. Bagaimana cara melakukannya? Apakah ada kelas untuk melakukannya?

Saya tahu tentang QgsDataSourceURIkelas tetapi sejauh yang saya tahu itu hanya mendapatkan hasil dari bidang geometri.


Apa itu dict_cur = conn.cursor (cursor_factory = psycopg2.extras.DictCursor)? >>> import psycopg2 >>> psycopg2.extras memberi saya Traceback Traceback (panggilan terakhir terakhir): File "<input>", baris 1, dalam <module> AttributeError: objek 'module' tidak memiliki atribut 'ekstra'
Jochen Schwarze

Jawaban:


14

1) Dengan PyQt4.QtSql: Gary Sherman menunjukkan cara melakukan kueri tabel spasial dalam Membuat Koneksi PostgreSQL Dari Datasource Lapisan 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

Dan Anda dapat membuka semua tabel / tampilan lainnya (spasial atau non spasial) dengan cara yang sama:

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) Atau Anda dapat menggunakan modul Python standar untuk 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]}')

Dengan tabel atau tampilan non spasial dan hasilnya sebagai kamus:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.