Quelqu'un peut-il m'aider à créer un script de traitement QGIS qui ajoute une séquence à une colonne d'identifiant unique existante (type: entier) dans PostGIS?
Ce serait très utile, par exemple comme solution de contournement pour le bogue # 6798 . Malheureusement, je n'ai aucune expérience Python.
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
la source
la source
Réponses:
Il convient de noter que le module python
psycopg2
ne semble pas automatiquementCOMMIT
une transaction (comme le font d'autres clients comme QGIS DB Manager ou pgAdmin), par conséquent, l'COMMIT
instruction doit faire partie de lasql
chaîne dans le script.Cela n'a pas d'importance avec les
SELECT
déclarations car dans ces cas, unCOMMIT
est évidemment effectué lors de l'obtention des résultats viacur.fetchall()
.Ceci est une version retravaillée du script de ma réponse ci-dessus:
la source
À condition que votre instruction SQL produise des résultats valides, les scripts ci-dessous devraient faire ce que vous recherchez. Malheureusement, je n'ai rien à portée de main pour tester cela, mais vous pouvez essayer de donner votre avis.
J'ai essayé de le commenter pour plus de commodité, le script effectue essentiellement trois étapes:
Notez la sortie de protocole du script.
la source
unexpected indent (, line 32) See log for more details
. Y a-t-il quelque chose que je fais mal? L'instruction SQL fonctionne dans 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
déclaration avait une indentation erronée. Je viens de corriger ça.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)
Il semble déjà y avoir un plugin similaire (bien qu'il crée un nouveau champ ID unique pour vous, plutôt que de créer une séquence.)
Cela suppose que vous avez déjà un champ d'ID unique (cela n'a pas besoin d'être numérique), mais que vous voulez un ID numérique simple à la place (1,2,3 ..)
Dans la boîte à outils Traitement, accédez à Scripts> Outils> Obtenir des scripts en ligne ...
Développez "Non installé" et choisissez "EquivalentNumField". N'oubliez pas de cocher la case avant de cliquer sur OK. Cela m'a rattrapé ... ;-)
Pour le trouver rapidement, tapez "Equiv" dans la barre de recherche de traitement, et vous devriez pouvoir double-cliquer dessus à partir de là.
Voici un exemple. Ces bois avaient un champ unique (osm_id) mais le plugin a ajouté un NUM_FIELD avec des valeurs numériques simples à la place
la source