Kann mir jemand helfen, ein QGIS-Verarbeitungsskript zu erstellen, das einer vorhandenen eindeutigen Bezeichnerspalte (Typ: Ganzzahl) in PostGIS eine Sequenz hinzufügt?
Dies wäre sehr hilfreich, z. B. als Problemumgehung für Fehler Nr. 6798 . Leider habe ich keine Python-Erfahrung.
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
verdunkelt durch den Mond
quelle
quelle
Antworten:
Es ist erwähnenswert, dass das Python-Modul
psycopg2
nicht automatischCOMMIT
eine Transaktion zu sein scheint (wie es andere Clients wie QGIS DB Manager oder pgAdmin tun), daher muss dieCOMMIT
Anweisung Teil dersql
Zeichenfolge im Skript sein.Dies spielt bei
SELECT
Aussagen keine Rolle , da in diesen Fällen aCOMMIT
offensichtlich ausgeführt wird, wenn Ergebnisse über erhalten werdencur.fetchall()
.Dies ist eine überarbeitete Version des Skripts aus meiner obigen Antwort:
quelle
Vorausgesetzt, Ihre SQL-Anweisung liefert gültige Ergebnisse, sollten die folgenden Skripte das tun, wonach Sie suchen. Leider habe ich nichts zur Hand, um dies zu testen, aber Sie könnten versuchen, Feedback zu geben.
Ich habe versucht, es der Einfachheit halber zu kommentieren. Im Grunde führt das Skript drei Schritte aus:
Beachten Sie die Protokollausgabe des Skripts.
quelle
unexpected indent (, line 32) See log for more details
. Gibt es etwas, was ich falsch mache? Die SQL-Anweisung funktioniert im DB-Manager.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
Aussage hatte einen falschen Einzug. Habe das gerade behoben.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)
Es scheint bereits ein ähnliches Plugin zu geben (obwohl es ein neues eindeutiges ID-Feld für Sie erstellt, anstatt eine Sequenz zu erstellen.)
Dies setzt voraus, dass Sie bereits ein eindeutiges ID-Feld haben (dieses muss nicht numerisch sein), sondern stattdessen eine einfache numerische ID (1,2,3 ..) möchten.
Gehen Sie in der Toolbox "Verarbeitung" zu " Skripte"> "Extras"> "Skripte aus dem Internet abrufen".
Erweitern Sie "Nicht installiert" und wählen Sie "EquivalentNumField". Denken Sie daran, das Kontrollkästchen zu aktivieren, bevor Sie auf OK klicken. Das hat mich erwischt ... ;-)
Um es schnell zu finden, geben Sie "Equiv" in die Verarbeitungssuchleiste ein, und Sie sollten in der Lage sein, von dort aus darauf zu doppelklicken.
Hier ist ein Beispiel. Diese Hölzer hatten ein eindeutiges Feld (osm_id), aber das Plugin hat stattdessen ein NUM_FIELD mit einfachen numerischen Werten hinzugefügt
quelle