कैसे एक QGIS प्रसंस्करण स्क्रिप्ट बनाने के लिए जो PostGIS में एक विशिष्ट पहचानकर्ता स्तंभ के लिए एक अनुक्रम जोड़ता है?


10

क्या कोई मुझे QGIS प्रसंस्करण स्क्रिप्ट बनाने में मदद कर सकता है जो PostGIS में एक मौजूदा विशिष्ट पहचानकर्ता कॉलम (प्रकार: पूर्णांक) के लिए एक अनुक्रम जोड़ता है?

यह काफी मददगार होगा, जैसे बग # 6798 के लिए एक समाधान के रूप में । दुर्भाग्य से, मेरे पास कोई पायथन अनुभव नहीं है।

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

CREATE SEQUENCE /*input_schema*/./*input_table*/_/*uic*/_seq OWNED BY /*input_schema*/./*input_table*/./*uic*/;
SELECT SETVAL('/*input_schema*/./*input_table*/_/*uic*/_seq', (SELECT MAX(/*uic*/) FROM /*input_schema*/./*input_table*/));
ALTER TABLE /*input_schema*/./*input_table*/
ALTER COLUMN /*uic*/ SET DEFAULT nextval('/*input_schema*/./*input_table*/_/*uic*/_seq'::regclass);

1
मैं पूछूंगा कि आपके वर्कफ़्लो में क्यों, और बग में वर्णित वर्कफ़्लो, आप पोस्टग्रेज़ल के लिए PGAdmin या अन्य कोर व्यवस्थापक टूल का उपयोग करके अपने पोस्टग्रेएसक्यूएल डेटा का प्रबंधन नहीं कर रहे हैं? मुझे नहीं पता कि क्यूजीआईएस में यह काम करने का प्रयास क्यों हो रहा है जब व्यवस्थापक उपकरण इसे ठीक करते हैं!
DPSSpatial

मेरे लिए, QGIS DB-Manager में तालिकाओं का प्रबंधन करना काफी सहज है। हालाँकि, मुझे यह देखने में भी दिलचस्पी है कि प्रोसेसिंग स्क्रिप्ट पोस्टजीआईएस प्रश्नों को कैसे चला सकती है।
eclipsed_by_the_moon

3
हमारे लिए, PGAdmin और SQL विंडो QGIS से अधिक हमारे "GIS" हैं! QGIS हमारे स्थानिक डेटा और आउटपुट के लिए केवल दृश्य ग्राहक है - सभी कार्य, जिसमें 'भू-प्रसंस्करण, स्क्रिप्ट आदि शामिल हैं, QGIS के बाहर किए जाते हैं ... ऐसा करने के लिए मौजूद उपकरण पहले से ही पूर्ण हैं, और वास्तव में, आदि। PostgresSQL / PostGIS डेटा के साथ इन गैर-QGIS उपकरणों का उपयोग करने का वर्कफ़्लो एक बेहतर अभ्यास है ...
DPSSpatial

जवाबों:


2

यह ध्यान देने योग्य है, कि अजगर मॉड्यूल psycopg2स्वचालित रूप से COMMITलेनदेन (क्यूजीआईएस डीबी मैनेजर या पीजीएडमिन जैसे अन्य ग्राहकों के रूप में) को नहीं लगता है , इसलिए COMMITविवरण को sqlस्क्रिप्ट में स्ट्रिंग का हिस्सा होना चाहिए ।

यह SELECTबयानों से कोई फर्क नहीं पड़ता क्योंकि शोध के मामलों COMMITमें स्पष्ट रूप से किया जाता है जब परिणाम प्राप्त होते हैं cur.fetchall()

यह मेरे उत्तर के ऊपर से स्क्रिप्ट का पुन: संस्करण है:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#--------- define Interface
##[my_scripts]=group
##Add Serial to PostgreSQL Table=name
##Postgres_Table=vector
##Unique_identifier_column=field Postgres_Table

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import *

from qgis.core import *
from qgis.gui import *
from qgis.utils import *

import psycopg2

#get the parameters for the tpg table into a directory
#get the table
pg_table = processing.getObject(Postgres_Table)
#create empty dictionary for key/value pairs of the tables connection parameters
db_params = {}
db_params['uic'] = Unique_identifier_column
#iterate over connection string
progress.setInfo(20*'-' + '  Connection parameters')
for param in pg_table.dataProvider().dataSourceUri().split(' '):
    key_val = param.split('=')
    progress.setInfo(str(key_val))
    try:
        #set key/value pair
        db_params[key_val[0]] = key_val[1]
    except:
        pass

#generate the sql statement string
#the text in round brackets are the keys from the db_params dictionary created above
#the values belonging to the keys are inserted into the string
progress.setInfo(20*'-' + '  SQL statement')
sql = """CREATE SEQUENCE %(table)s_%(uic)s_seq OWNED BY %(table)s.%(uic)s;
SELECT SETVAL('%(table)s_%(uic)s_seq', (SELECT MAX(%(uic)s) FROM %(table)s)); 
ALTER TABLE %(table)s ALTER COLUMN %(uic)s SET DEFAULT nextval('%(table)s_%(uic)s_seq'::regclass);
COMMIT;""" % db_params
#remove double quotes
sql = sql.replace('"','') 
progress.setInfo(sql)

#make connection string
constr = """dbname=%(dbname)s host=%(host)s port=%(port)s user=%(user)s     password=%(password)s""" % db_params
progress.setInfo(20*'-' + '  DB Connection string')
progress.setInfo(constr)
#make db connection
con = psycopg2.connect(constr)
cur = con.cursor()
#execute the above created sql statement
progress.setInfo(20*'-' + '  Executing SQL statement ...')
cur.execute(sql)
progress.setInfo(20*'-' + '  ... done.')

6

बशर्ते आपका SQL स्टेटमेंट वैध परिणाम उत्पन्न करता है, नीचे दी गई स्क्रिप्ट्स को वही करना चाहिए जो आप बाद में कर रहे हैं। दुर्भाग्य से मेरे पास इसका परीक्षण करने के लिए कुछ भी नहीं है, लेकिन आप कोशिश कर सकते हैं और प्रतिक्रिया दे सकते हैं।

मैंने इसे सुविधा के लिए टिप्पणी करने की कोशिश की, मूल रूप से स्क्रिप्ट तीन चरणों को पूरा करती है:

  • चयनित परत के लिए डेटाबेस कनेक्शन पैरामीटर प्राप्त करें (पोस्टग्रेट्स होना चाहिए)
  • sql स्टेटमेंट स्ट्रिंग में कनेक्शन पैरामीटर भरें
  • sql स्टेटमेंट निष्पादित करें

स्क्रिप्ट के प्रोटोकॉल आउटपुट पर ध्यान दें।

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#--------- define Interface
##[my_scripts]=group
##Add Serial to PostgreSQL Table=name
##Postgres_Table=vector
##Unique_identifier_column=string replace_this_with_your_uic

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import *

from qgis.core import *
from qgis.gui import *
from qgis.utils import *

import psycopg2

#get the parameters for the tpg table into a directory
#get the table
pg_table = processing.getObject(Postgres_Table)
#create empty dictionary for key/value pairs of the tables connection parameters
db_params = {}
db_params['uic'] = Unique_identifier_column
#iterate over connection string
progress.setInfo(20*'-' + '  Connection parameters')
for param in pg_table.dataProvider().dataSourceUri().split(' '):
    key_val = param.split('=')
    progress.setInfo(str(key_val))
    try:
        #set key/value pair
        db_params[key_val[0]] = key_val[1]
    except:
        pass

#generate the sql statement string
#the text in round brackets are the keys from the db_params dictionary created above
#the values belonging to the keys are inserted into the string
progress.setInfo(20*'-' + '  SQL statement')
sql = """CREATE SEQUENCE %(table)s_%(uic)s_seq OWNED BY %(table)s.%(uic)s;
            SELECT SETVAL(%(table)s_%(uic)s_seq, (SELECT MAX(%(uic)s) FROM %(table)s));
            ALTER TABLE %(table)s
            ALTER COLUMN %(uic)s SET DEFAULT nextval(%(table)s_%(uic)s_seq::regclass);""" % db_params
#remove double quotes
sql = sql.replace('"','') 
progress.setInfo(sql)

#make connection string
constr = """dbname=%(dbname)s host=%(host)s port=%(port)s user=%(user)s     password=%(password)s""" % db_params
progress.setInfo(20*'-' + '  DB Connection string')
progress.setInfo(constr)
#make db connection
con = psycopg2.connect(constr)
cur = con.cursor()
#execute the above created sql statement
progress.setInfo(20*'-' + '  Executing SQL statement ...')
cur.execute(sql)
progress.setInfo(20*'-' + '  ... done.')

मैंने स्क्रिप्ट का परीक्षण किया है और प्रोसेसिंग लॉग कहता है unexpected indent (, line 32) See log for more details। क्या मैं कुछ गलत कर रहा हूं? SQL स्टेटमेंट DB-Manager में काम कर रहा है।
eclipsed_by_the_moon

File "C:/Users/abc/.qgis2/python/plugins\processing\core\GeoAlgorithm.py", line 230, in execute self.processAlgorithm(progress) File "C:/Users/abc/.qgis2/python/plugins\processing\script\ScriptAlgorithm.py", line 298, in processAlgorithm exec((script), ns) File "<string>", line 32 try: ^
eclipsed_by_the_moon

हां, मेरी गलती है। tryबयान गलत खरोज था। बस यही तय किया।
जोचन श्वार्ज़े

इसे ठीक करने के लिए Thx, लेकिन स्क्रिप्ट चलाते समय मुझे पायथन त्रुटि मिलती है।
ग्रहण १०/१०/२०/१०

Traceback (most recent call last): File "C:/Users/abc/.qgis2/python/plugins\processing\gui\AlgorithmDialog.py", line 219, in accept if runalg(self.alg, self): File "C:/Users/abc/.qgis2/python/plugins\processing\gui\AlgorithmExecutor.py", line 51, in runalg alg.execute(progress) File "C:/Users/abc/.qgis2/python/plugins\processing\core\GeoAlgorithm.py", line 244, in execute unicode(e) + self.tr('\nSee log for more details')) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 44: ordinal not in range(128)
ग्रहण १०/१०/२०/१०

3

ऐसा लगता है कि पहले से ही एक समान प्लगइन है (हालांकि यह अनुक्रम बनाने के बजाय आपके लिए एक नया विशिष्ट आईडी फ़ील्ड बनाता है ।)

यह मानता है कि आपके पास पहले से ही एक अद्वितीय आईडी फ़ील्ड है (इसे संख्यात्मक होने की आवश्यकता नहीं है), लेकिन इसके बजाय एक साधारण संख्यात्मक आईडी चाहते हैं (1,2,3 ..)

टूलबॉक्स में संसाधन, लिपियों पर जाएँ> उपकरण> ऑनलाइन से स्क्रिप्ट प्राप्त करें ...

"इंस्‍टॉल नहीं" का विस्‍तार करें और "इक्विलेनेंटनमफिल्‍ड" चुनें। ठीक पर क्लिक करने से पहले चेकबॉक्स पर क्लिक करना याद रखें। कि मुझे पकड़ लिया ... ;-)

यहां छवि विवरण दर्ज करें

इसे जल्दी से खोजने के लिए, प्रोसेसिंग सर्च बार में "इक्विव" टाइप करें, और आपको इसे वहां से डबल-क्लिक करने में सक्षम होना चाहिए।

यहां छवि विवरण दर्ज करें

यहाँ एक उदाहरण है। इन लकड़ियों में एक अनूठा क्षेत्र (osm_id) था, लेकिन प्लगइन ने इसके बजाय सरल संख्यात्मक मानों के साथ एक NUM_FIELD जोड़ा है

यहां छवि विवरण दर्ज करें


स्टीव, यह एक उपयोगी स्क्रिप्ट है, लेकिन मैं कुछ अलग खोज रहा हूं।
ग्रहण

@eclipsed_by_the_moon यह उत्तर कैसा है जो आप नहीं देख रहे हैं? यह अंततः एक अद्वितीय पहचानकर्ता कॉलम की आवश्यकता की आपकी समस्या को हल करने के लिए प्रकट होता है।
kttii
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.