Alguém pode me ajudar a criar um script de processamento QGIS que adicione uma sequência a uma coluna identificadora exclusiva existente (tipo: número inteiro) no PostGIS?
Isso seria bastante útil, por exemplo, como uma solução alternativa para o bug # 6798 . Infelizmente, eu não tenho nenhuma experiência em 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
fonte
fonte
Respostas:
Vale ressaltar que esse módulo python
psycopg2
não parece automaticamenteCOMMIT
uma transação (como outros clientes, como o QGIS DB Manager ou o pgAdmin), portanto, aCOMMIT
instrução deve fazer parte dasql
cadeia de caracteres do script.Isso não importa com as
SELECT
declarações, porque nesses casos aCOMMIT
é obviamente realizada ao obter resultados viacur.fetchall()
.Esta é uma versão reformulada do script da minha resposta acima:
fonte
Desde que sua instrução SQL produza resultados válidos, os scripts abaixo devem fazer o que você procura. Infelizmente, não tenho nada em mãos para testar isso, mas você pode tentar dar um feedback.
Tentei comentar por conveniência, basicamente o script executa três etapas:
Observe a saída do protocolo do script.
fonte
unexpected indent (, line 32) See log for more details
. Existe algo que estou fazendo errado? A instrução SQL está funcionando no 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
declaração teve um recuo errado. Apenas consertei isso.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 já haver um plug-in semelhante (embora ele crie um novo campo de ID exclusivo para você, em vez de criar uma sequência.)
Isso pressupõe que você já tenha um campo de ID exclusivo (não precisa ser numérico), mas deseja um ID numérico simples (1,2,3 ..)
Na caixa de ferramentas Processando, vá para Scripts> Ferramentas> Obter scripts de online ...
Expanda "Não instalado" e escolha "EquivalentNumField". Lembre-se de clicar na caixa de seleção antes de clicar em OK. Isso me pegou de fora ... ;-)
Para encontrá-lo rapidamente, digite "Equiv" na barra de pesquisa de processamento e você poderá clicar duas vezes nele.
Aqui está um exemplo. Essas madeiras tinham um campo exclusivo (osm_id), mas o plug-in adicionou um NUM_FIELD com valores numéricos simples
fonte