Truy xuất các kết nối PostGIS có sẵn trong PyQGIS


10

Tôi có thể truy xuất các kết nối có sẵn đến cơ sở dữ liệu PostGIS trong PyQGIS không? Tôi muốn cung cấp một danh sách các kết nối db có sẵn và sau đó là danh sách các bảng trong ui của plugin của tôi.

Tôi đã kiểm tra sách dạy nấu ăn nhưng không thể tìm ra cách nào để tiếp tục với điều này.

Câu trả lời:


11

Để có được thông tin bạn muốn, bạn cần sử dụng QSettingslớp. Điều này sử dụng một cấu trúc phân cấp, như Windows registry. Nếu bạn có phiên bản mới nhất của QGIS, bạn có thể xem cấu trúc phân cấp này bằng Cài đặt> Tùy chọn> Nâng cao

Đoạn mã sau hoạt động từ Bảng điều khiển Python. Tôi đã không thử điều này từ một plugin hoặc bên ngoài QGIS, vì vậy một số công việc bổ sung có thể được yêu cầu trong những trường hợp này.

Để xem cấu trúc phân cấp, hãy sử dụng tính năng này trong bảng điều khiển python của QGIS ...

from PyQt4.QtCore import QSettings
qs = QSettings()
for k in sorted(qs.allKeys())
    print k

Đầu ra cho một số gợi ý ...

.. snip ..
Plugins/searchPathsForPlugins
Plugins/valuetool/mouseClick
PostgreSQL/connections/GEODEMO/allowGeometrylessTables
PostgreSQL/connections/GEODEMO/database
PostgreSQL/connections/GEODEMO/dontResolveType
PostgreSQL/connections/GEODEMO/estimatedMetadata    
.. snip ...

Vì vậy, bạn có thể nhận chi tiết kết nối cơ sở dữ liệu bằng cách lọc tiền tố PostgreSQL / Connections /

Vì vậy, trong trường hợp này tôi có một kết nối được gọi là GEODEMO, tôi có thể có được tên người dùng như vậy ...

from PyQt4.QtCore import QSettings
qs = QSettings()
print qs.value("PostgreSQL/connections/GEODEMO/username")
>> steven

Khi bạn đã có cơ sở dữ liệu, bạn có thể truy xuất danh sách các bảng bằng lớp PostGisDBConnector .

import db_manager.db_plugins.postgis.connector as con
from qgis.core import QgsDataSourceURI

uri = QgsDataSourceURI()
uri.setConnection("127.0.0.1", "5432", "database_name", "username", "password")
c = con.PostGisDBConnector(uri)
print c
print c.getTables()

Lưu ý rằng cổng phải là một chuỗi, không phải là một số.


1
Cảm ơn, điều đó hoạt động tốt với tôi trong một plugin và về cơ bản không cần điều chỉnh. Mặc dù vậy, khi truyền giá trị trả về của qs.value ("PostgreSQL / links / GEODEMO / port") thành chuỗi thì uri.setConnection sau đó đã phàn nàn về cổng! Nó không cần thiết để đúc thành chuỗi. giá trị trả về bình thường như số là đủ tốt. Ngoài ra, quy trình giả định rằng tên người dùng và mật khẩu được lưu với kết nối cơ sở dữ liệu. Ở đây, tốt hơn là kiểm tra 'saveUsername' và 'savePassword' để tạo khả năng cho người dùng nhập vào trong trường hợp một trong các giá trị trả về là 'false'.
Thomas Becker

7

Câu trả lời của tôi sẽ gần giống như câu trả lời trước nhưng bạn có thể tránh lặp lại tất cả các cài đặt và chỉ nhận được các kết nối PostgreQuery với

from PyQt4.QtCore import QSettings

s = QSettings()
s.beginGroup("PostgreSQL/connections")

print s.allKeys()
print s.value("GEODEMO/username") 

s.endGroup()

Vâng, điều đó làm việc và trả lời câu hỏi. Tôi cần một giải pháp tổng quát hơn chỉ các kết nối PostgreSQL, không thể truy xuất được từ câu hỏi ban đầu. Tuy nhiên, tốt để biết về nhóm!
Thomas Becker
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.