ดึงการเชื่อมต่อ PostGIS ที่มีอยู่ใน PyQGIS


11

ฉันสามารถดึงการเชื่อมต่อที่มีอยู่ไปยังฐานข้อมูล PostGIS ใน PyQGIS ได้หรือไม่ ฉันต้องการให้รายการของการเชื่อมต่อฐานข้อมูลที่มีอยู่และต่อมาก็คือรายการตารางภายใน UI ของปลั๊กอินของฉัน

ฉันตรวจสอบตำราอาหาร แต่ไม่สามารถหาทางที่จะไปให้ไกลกว่านี้ได้

คำตอบ:


12

ในการรับข้อมูลที่คุณต้องการคุณต้องใช้QSettingsคลาส สิ่งนี้ใช้โครงสร้างแบบลำดับชั้นเช่นรีจิสทรีของ Windows หากคุณมี QGIS เวอร์ชันล่าสุดคุณสามารถดูลำดับชั้นได้โดยใช้การตั้งค่า> ตัวเลือก> ขั้นสูง

รหัสต่อไปนี้ใช้งานได้จาก Python Console ฉันไม่ได้ลองจากปลั๊กอินหรือนอก QGIS ดังนั้นอาจต้องมีการทำงานเพิ่มเติมในกรณีเหล่านี้

เพื่อดูลำดับชั้นให้ใช้สิ่งนี้ในคอนโซล Python ของ QGIS ...

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

ผลลัพธ์ให้คำแนะนำ ...

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

ดังนั้นคุณสามารถรับรายละเอียดการเชื่อมต่อฐานข้อมูลโดยการกรองคำนำหน้าPostgreSQL / Connections /

ดังนั้นในกรณีนี้ฉันมีการเชื่อมต่อที่เรียกว่า GEODEMO ฉันจะได้รับชื่อผู้ใช้เช่นนั้น ...

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

เมื่อคุณมีฐานข้อมูลในใจคุณสามารถเรียกดูรายการของตารางโดยใช้ระดับ 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()

โปรดทราบว่าพอร์ตควรเป็นสตริงไม่ใช่ตัวเลข


1
ขอบคุณที่ใช้งานได้ดีสำหรับฉันในปลั๊กอินและโดยทั่วไปไม่จำเป็นต้องทำการปรับเปลี่ยน สิ่งหนึ่งแม้ว่า ... เมื่อส่งค่า qs.value ("PostgreSQL / connections / GEODEMO / port") ไปที่สตริงดังนั้น uri.setConnection หลังบ่นเกี่ยวกับพอร์ต! ไม่จำเป็นต้องส่งไปที่สตริง ค่าส่งคืนปกติเป็นจำนวนดีพอ ขั้นตอนจะถือว่าชื่อผู้ใช้และรหัสผ่านถูกบันทึกด้วยการเชื่อมต่อฐานข้อมูล ที่นี่จะเป็นการดีกว่าถ้าตรวจสอบ 'saveUsername' และ 'savePassword' เพื่อสร้างความเป็นไปได้สำหรับการป้อนข้อมูลของผู้ใช้ในกรณีที่หนึ่งในค่าตอบแทนเป็น 'เท็จ'
Thomas Becker

7

คำตอบของฉันจะใกล้เคียงกับคำตอบก่อนหน้านี้ แต่คุณสามารถหลีกเลี่ยงการวนซ้ำการตั้งค่าทั้งหมดและรับเฉพาะการเชื่อมโยง PostgreSQL ด้วย

from PyQt4.QtCore import QSettings

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

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

s.endGroup()

ใช่แล้วมันใช้งานได้และตอบคำถาม ฉันต้องการโซลูชันทั่วไปมากกว่าการเชื่อมต่อ PostgreSQL เท่านั้นซึ่งไม่สามารถเรียกคืนได้จากคำถามเริ่มต้น อย่างไรก็ตามสิ่งที่ควรรู้เกี่ยวกับการจัดกลุ่ม!
Thomas Becker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.