Ambil koneksi PostGIS yang tersedia di PyQGIS

11

Bisakah saya mengambil koneksi yang tersedia ke database PostGIS di PyQGIS? Saya ingin memberikan daftar koneksi db yang tersedia, dan kemudian daftar tabel di dalam ui plugin saya.

Saya memeriksa buku masak tetapi tidak dapat menemukan cara untuk melanjutkan ini.

Thomas Becker
sumber

Jawaban:

12

Untuk mendapatkan informasi yang Anda inginkan, Anda perlu menggunakan QSettingskelas. Ini menggunakan struktur hierarkis, seperti registri Windows. Jika Anda memiliki versi terbaru QGIS, Anda dapat melihat hierarki ini menggunakan Pengaturan> Opsi> Tingkat Lanjut

Kode berikut berfungsi dari Konsol Python. Saya belum mencoba ini dari plugin atau di luar QGIS, jadi beberapa pekerjaan tambahan mungkin diperlukan dalam kasus ini.

Untuk melihat hierarki, gunakan ini di konsol python QGIS ...

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

Outputnya memberikan beberapa petunjuk ...

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

Jadi Anda bisa mendapatkan detail koneksi database dengan memfilter untuk awalan PostgreSQL / Connections /

Jadi dalam hal ini saya memiliki koneksi bernama GEODEMO, saya bisa mendapatkan nama pengguna seperti itu ...

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

Setelah Anda memiliki basis data, Anda dapat mengambil daftar tabel menggunakan kelas 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()

Perhatikan bahwa port harus berupa string, bukan angka.

Steven Kay
sumber
1
Terima kasih, itu berfungsi dengan baik untuk saya dalam sebuah plugin, dan pada dasarnya tidak diperlukan penyesuaian. Satu hal yang ... Ketika casting nilai kembalinya qs.value ("PostgreSQL / koneksi / GEODEMO / port") ke string maka uri.setConnection yang terakhir mengeluh tentang port! Tidak perlu dilemparkan ke string. nilai pengembalian normal karena jumlahnya cukup baik. Selain itu, prosedur mengasumsikan bahwa nama pengguna dan kata sandi disimpan dengan koneksi database. Di sini lebih baik untuk memeriksa 'saveUsername' dan 'savePassword' untuk membuat kemungkinan input pengguna jika salah satu nilai yang dikembalikan adalah 'false'.
Thomas Becker
7

Jawaban saya akan hampir sama dengan yang sebelumnya tetapi Anda dapat menghindari untuk mengulang semua pengaturan dan hanya memperoleh koneksi PostgreSQL dengan

from PyQt4.QtCore import QSettings

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

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

s.endGroup()
ThomasG77
sumber
Ya, itu berfungsi dan menjawab pertanyaan. Saya membutuhkan solusi yang lebih umum daripada hanya koneksi PostgreSQL, yang tidak dapat diambil dari pertanyaan awal. Namun, senang mengetahui tentang pengelompokan!
Thomas Becker