Кто-нибудь может мне помочь создать сценарий обработки QGIS, который добавляет последовательность к существующему столбцу уникального идентификатора (тип: целое число) в PostGIS?
Это было бы весьма полезно, например, в качестве обходного пути для ошибки № 6798 . К сожалению, у меня нет опыта работы с 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
источник
источник
Ответы:
Стоит отметить, что модуль python
psycopg2
не кажется автоматическиCOMMIT
транзакцией (как это делают другие клиенты, такие как QGIS DB Manager или pgAdmin), поэтомуCOMMIT
оператор должен быть частьюsql
строки в скрипте.Это не имеет значения для
SELECT
утверждений, потому что в этих случаях aCOMMIT
, очевидно, выполняется при получении результатов черезcur.fetchall()
.Это переработанная версия скрипта из моего ответа выше:
источник
Если ваш оператор SQL дает правильные результаты, приведенные ниже сценарии должны делать то, что вам нужно. К сожалению, у меня нет ничего под рукой, чтобы проверить это, но вы можете попробовать и дать отзыв.
Я попытался прокомментировать это для удобства, в основном скрипт выполняет три шага:
Обратите внимание на вывод протокола скрипта.
источник
unexpected indent (, line 32) See log for more details
. Я что-то не так делаю? Оператор SQL работает в 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
Заявление было неправильно отступов. Просто исправил это.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)
Похоже, что подобный плагин уже есть (хотя он создает для вас новое уникальное поле идентификатора, а не последовательность).
Предполагается, что у вас уже есть уникальное поле идентификатора (оно не обязательно должно быть числовым), но вместо этого вам нужен простой числовой идентификатор (1,2,3 ..)
В панели инструментов Обработка перейдите в Сценарии> Инструменты> Получить сценарии из Интернета ...
Разверните «Не установлено» и выберите «EquivalentNumField». Не забудьте установить флажок перед нажатием кнопки ОК. Это застало меня врасплох ... ;-)
Чтобы быстро найти его, введите «Эквив» в строке поиска обработки, и вы сможете дважды щелкнуть по нему.
Вот пример. Эти леса имели уникальное поле (osm_id), но плагин добавил NUM_FIELD с простыми числовыми значениями
источник