¿Alguien puede ayudarme a crear un script de procesamiento QGIS que agregue una secuencia a una columna de identificador único existente (tipo: entero) en PostGIS?
Esto sería bastante útil, por ejemplo, como solución para el error # 6798 . Desafortunadamente, no tengo ninguna experiencia en 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
eclipsado_por_la_luna
fuente
fuente
Respuestas:
Vale la pena señalar que el módulo de Python
psycopg2
no parece ser automáticamenteCOMMIT
una transacción (como lo hacen otros clientes como QGIS DB Manager o pgAdmin), por lo tanto, laCOMMIT
declaración debe ser parte de lasql
cadena en el script.Esto no importa con las
SELECT
declaraciones porque en estos casos,COMMIT
obviamente, se lleva a cabo cuando se obtienen resultados a través decur.fetchall()
.Esta es una versión reelaborada del script de mi respuesta anterior:
fuente
Siempre que su declaración SQL produzca resultados válidos, los siguientes scripts deben hacer lo que busca. Lamentablemente, no tengo nada a mano para probar esto, pero podrías intentar dar tu opinión.
Traté de comentarlo por conveniencia, básicamente el script lleva a cabo tres pasos:
Tenga en cuenta la salida del protocolo de la secuencia de comandos.
fuente
unexpected indent (, line 32) See log for more details
. ¿Hay algo que estoy haciendo mal? La instrucción SQL está funcionando en el 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
declaración tenía una sangría incorrecta. Acabo de arreglar esto.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)
Parece que ya hay un complemento similar (aunque crea un nuevo campo de ID único para usted, en lugar de crear una secuencia).
Esto supone que ya tiene un campo de identificación único (esto no necesita ser numérico), sino que desea una identificación numérica simple (1,2,3 ..)
En la caja de herramientas Procesamiento, vaya a Scripts> Herramientas> Obtener scripts en línea ...
Expanda "No instalado" y elija "EquivalentNumField". Recuerde hacer clic en la casilla de verificación antes de hacer clic en Aceptar. Eso me sorprendió ... ;-)
Para encontrarlo rápidamente, escriba "Equiv" en la barra de búsqueda de procesamiento, y debería poder hacer doble clic desde allí.
Aquí hay un ejemplo. Estas maderas tenían un campo único (osm_id) pero el complemento ha agregado un NUM_FIELD con valores numéricos simples.
fuente