Làm cách nào để thực hiện các truy vấn SQL và nhận kết quả từ bảng điều khiển python của QGIS?


10

Tôi đang viết một kịch bản python bằng API QGIS. Tôi phải lấy kết quả từ bảng cơ sở dữ liệu postgres. Bảng này có trường hình học và các trường phi hình học khác.

Tôi muốn thực hiện các truy vấn SQL trên các trường phi hình học và nhận kết quả trong mã của mình. làm như thế nào? Có lớp nào để làm như vậy không?

Tôi biết về QgsDataSourceURIlớp học nhưng theo tôi biết nó chỉ nhận được kết quả từ các trường hình học.


Dict_cur = Conn.cthon (con trỏ_factory = psycopg2.extras.DictCthon) là gì? >>> nhập psycopg2 >>> psycopg2.extras cung cấp cho tôi TracBack TracBack (cuộc gọi gần đây nhất): Tệp "<input>", dòng 1, trong <module> AttributionError: 'module' đối tượng không có thuộc tính 'phụ'
Jochen Schwarze

Câu trả lời:


14

1) Với PyQt4.QtSql: Gary Sherman chỉ ra cách truy vấn bảng không gian trong việc tạo kết nối PostgreQuery từ một nguồn dữ liệu lớp 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

Và bạn có thể mở tất cả các bảng / khung nhìn khác (không gian hoặc không không gian) tương tự:

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) Hoặc bạn có thể sử dụng mô-đun Python tiêu chuẩn cho 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]}')

Với một bảng hoặc không gian không gian và kết quả là một từ điển:

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

1

Nó phụ thuộc vào DB bạn đang sử dụng. Nếu đó là Postgresql, bạn phải cài đặt và nhập psycopg2 thư viện PostgreQuery + Python

để cài đặt sử dụng:

pip install psycopg2

hoặc là:

easy_install install psycopg2

Thực hiện theo hướng dẫn này , hoặc nếu không, cho những điều cơ bản

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.