Czy ktoś może mi pomóc w utworzeniu skryptu przetwarzania QGIS, który dodaje sekwencję do istniejącej unikalnej kolumny identyfikatora (typ: liczba całkowita) w PostGIS?
Byłoby to bardzo pomocne, np. Jako obejście błędu 6798 . Niestety nie mam doświadczenia w Pythonie.
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);
postgis
pyqgis
qgis-processing
serial
eclipsed_by_the_moon
źródło
źródło
Odpowiedzi:
Warto zauważyć, że moduł Pythona
psycopg2
nie wydaje się automatycznieCOMMIT
transakcją (jak robią to inni klienci, tacy jak QGIS DB Manager lub pgAdmin), dlategoCOMMIT
instrukcja musi być częściąsql
ciągu w skrypcie.Nie ma to znaczenia w przypadku
SELECT
instrukcji, ponieważ w tych przypadkach aCOMMIT
jest oczywiście przeprowadzane przy uzyskiwaniu wynikówcur.fetchall()
.To jest przerobiona wersja skryptu z mojej powyższej odpowiedzi:
źródło
Pod warunkiem, że twoja instrukcja SQL generuje prawidłowe wyniki, poniższe skrypty powinny robić to, czego szukasz. Niestety nie mam nic pod ręką, aby to przetestować, ale możesz spróbować wyrazić opinię.
Próbowałem to skomentować dla wygody, w zasadzie skrypt wykonuje trzy kroki:
Zanotuj wynik protokołu skryptu.
źródło
unexpected indent (, line 32) See log for more details
. Czy coś robię źle? Instrukcja SQL działa w DB-Managerze.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
Oświadczenie miał zły wcięcia. Właśnie to naprawiłem.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)
Wydaje się, że już istnieje podobna wtyczka (chociaż tworzy dla ciebie nowe unikalne pole identyfikatora, zamiast tworzyć sekwencję).
Zakłada się, że masz już unikalne pole identyfikatora (nie musi to być wartość liczbowa), ale zamiast tego potrzebujesz prostego identyfikatora numerycznego (1,2,3 ..)
W przyborniku Przetwarzanie przejdź do Skrypty> Narzędzia> Pobierz skrypty z Internetu ...
Rozwiń „Niezainstalowany” i wybierz „EquivalentNumField”. Pamiętaj, aby kliknąć pole wyboru przed kliknięciem OK. To mnie złapało ... ;-)
Aby szybko go znaleźć, wpisz „Equiv” na pasku wyszukiwania przetwarzania i powinieneś być w stanie kliknąć go dwukrotnie.
Oto przykład. Te lasy miały unikalne pole (osm_id), ale wtyczka dodała NUM_FIELD z prostymi wartościami liczbowymi
źródło