SQLクエリを実行してQGIS Pythonコンソールから結果を取得する方法は?


10

QGIS APIを使用してPythonスクリプトを作成しています。postgresデータベーステーブルから結果を取得する必要があります。テーブルには、ジオメトリフィールドとその他の非ジオメトリフィールドがあります。

非ジオメトリフィールドでSQLクエリを実行し、コードで結果を取得したいと考えています。これを行う方法?そうするクラスはありますか?

QgsDataSourceURIクラスについては知っていますが、私が知る限り、ジオメトリフィールドからの結果しか得られません。


dict_cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)とは何ですか?>>> import psycopg2 >>> psycopg2.extrasを実行すると、トレースバックトレースバック(最新の呼び出しは最後):ファイル "<input>"、1行目の<module> AttributeError: 'module' object has no attribute 'extras'
シュヴァルツェ

回答:


14

1)PyQt4.QtSqlの場合:Gary Shermanは、QGISレイヤーデータソースからのPostgreSQL接続の作成で空間テーブルをクエリする方法を示しています。

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

そして、他のすべてのテーブル/ビュー(空間または非空間)を同様に開くことができます。

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)または、PostgreSQL / PostGISの標準Pythonモジュールを使用できます: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]}')

非空間テーブルまたはビュー、および結果を辞書として:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.