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.

M Omayr
sumber
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
gen
sumber
1

Itu tergantung pada DB apa yang Anda gunakan. Jika Postgresql, Anda harus menginstal dan mengimpor psycopg2 perpustakaan PostgreSQL + Python

untuk menginstal gunakan:

pip install psycopg2

atau:

easy_install install psycopg2

Ikuti tutorial ini , atau yang lain, untuk dasar-dasarnya

Di bawah Radar
sumber