কিউজিআইএস প্রসেসিং স্ক্রিপ্ট কীভাবে তৈরি করা যায় যা পোস্টজিআইএসে একটি অনন্য সনাক্তকারী কলামে একটি অনুক্রম যুক্ত করে?


10

কেউ কি কিউজিআইএস প্রসেসিং স্ক্রিপ্ট তৈরি করতে আমাকে সহায়তা করতে পারে যা পোস্টজিআইএসে বিদ্যমান অনন্য শনাক্তকারী কলামে (টাইপ: পূর্ণসংখ্যার) ক্রম যুক্ত করে?

এটি বেশ সহায়ক হবে, উদাহরণস্বরূপ বাগ # 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
আমি জিজ্ঞাসা করব কেন আপনার ওয়ার্কফ্লো এবং বাগের মধ্যে বর্ণিত ওয়ার্কফ্লোতে আপনি পোস্টগ্রেএসকিএল এর জন্য পিজিএডমিন বা অন্যান্য মূল অ্যাডমিন সরঞ্জাম ব্যবহার করে আপনার পোস্টগ্রাইএসকিউএল ডেটা পরিচালনা করছেন না? আমি জানি না কেন প্রশাসনিক সরঞ্জামগুলি ঠিকঠাক করলে কিউজিআইএস-এ এই কাজটি করতে ব্যয় হয়েছে?
DPSSpatial

আমার কাছে, কিউজিআইএস ডিবি-ম্যানেজারে সারণীগুলি পরিচালনা করা বেশ স্বজ্ঞাত। তবে, প্রসেসিং স্ক্রিপ্ট কীভাবে পোস্টজিআইএস অনুসন্ধান চালাতে পারে তা দেখতে আমি আগ্রহী।
eclipsed_by_the_moon

3
আমাদের জন্য, পিজিএডমিন এবং এসকিউএল উইন্ডো কিউজিআইএসের চেয়ে আমাদের "জিআইএস" এর চেয়ে বেশি! কিউজিআইএস হ'ল আমাদের স্পেসিয়াল ডেটা এবং আউটপুটগুলির ভিজ্যুয়াল ক্লায়েন্ট - 'জিও' প্রসেসিং, স্ক্রিপ্টস ইত্যাদিসহ সমস্ত কাজ কিউআইজিআইএসের বাইরে সম্পন্ন হয় ... এটি করার জন্য যে সরঞ্জামগুলি বিদ্যমান তা ইতিমধ্যে নিখুঁত, এবং সত্যই, পোস্টগ্রিস এসকিউএল / পোস্টজিআইএস ডেটা সহ এই নন-কিউজিআইএস সরঞ্জামগুলি ব্যবহারের কর্মপ্রবাহ একটি আরও ভাল অনুশীলন ...
ডিপিএসএসপিশিয়াল

উত্তর:


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

আপনার এসকিউএল বিবৃতিটি কার্যকর ফলাফল উত্পন্ন করে, নীচের স্ক্রিপ্টগুলি আপনার পরে কী করবে। দুর্ভাগ্যক্রমে আমার কাছে এটি পরীক্ষা করার মতো কিছু নেই তবে আপনি চেষ্টা করে প্রতিক্রিয়া জানাতে পারেন।

আমি সুবিধার জন্য এটি মন্তব্য করার চেষ্টা করেছি, মূলত স্ক্রিপ্টটি তিনটি পদক্ষেপ বহন করে:

  • নির্বাচিত স্তরটির জন্য ডাটাবেস সংযোগের পরামিতিগুলি অর্জন করুন (পোস্টগ্রিজ হওয়া উচিত)
  • স্কেল স্টেটমেন্ট স্ট্রিংয়ে সংযোগের পরামিতিগুলি পূরণ করুন
  • বর্গক্ষেত্র বিবৃতি কার্যকর করুন

স্ক্রিপ্টের প্রোটোকল আউটপুট নোট করুন।

#!/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। আমি কি ভুল করছি কিছু আছে? এসকিউএল স্টেটমেন্টটি ডিবি-ম্যানেজারে কাজ করছে।
ग्रहण_

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: ^
ग्रहण_

হ্যাঁ, আমার দোষ 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 ..)

প্রসেসিং সরঞ্জামবাক্সে, স্ক্রিপ্টগুলি> সরঞ্জামসমূহ> অনলাইন থেকে স্ক্রিপ্টগুলি পান ...

"ইনস্টল করা নেই" প্রসারিত করুন এবং "ইকুইভ্যালেন্টনামফিল্ড" নির্বাচন করুন। ওকে ক্লিক করার আগে চেকবক্সটি ক্লিক করতে ভুলবেন না। এটি আমাকে ধরে ফেলল ... ;-)

এখানে চিত্র বর্ণনা লিখুন

এটি দ্রুত খুঁজে পেতে, প্রসেসিং অনুসন্ধান বারে "Equiv" টাইপ করুন এবং সেখান থেকে আপনার এটি ডাবল-ক্লিক করতে সক্ষম হওয়া উচিত।

এখানে চিত্র বর্ণনা লিখুন

এখানে একটি উদাহরণ। এই কাঠগুলির একটি অনন্য ক্ষেত্র ছিল (osm_id) তবে প্লাগইনটি পরিবর্তে সাধারণ সংখ্যাযুক্ত মান সহ একটি NUM_FIELD যুক্ত করেছে

এখানে চিত্র বর্ণনা লিখুন


স্টিভ, এটি একটি দরকারী স্ক্রিপ্ট, তবে আমি আলাদা কিছু খুঁজছি।
eclipsed_by_the_moon

@ ক্লিপড_বি_ত_মুন আপনি কী খুঁজছেন এর উত্তরটি কীভাবে নয়? এটি শেষ পর্যন্ত আপনার অনন্য শনাক্তকারী কলামের প্রয়োজনের সমস্যাটি সমাধান করে বলে মনে হচ্ছে।
কেটিআই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.