Editor (arcpy.da)
Резюме
Класс Editor позволяет использовать сеансы и операции редактирования для управления транзакциями базы данных.
Все внесенные изменения являются временными, пока вы не сохраните и не примените их к данным. Вы также можете выйти из сеанса редактирования, не сохраняя изменений.
Обсуждение
Сеансы и операции редактирования имеют следующие преимущества:
- Группировка правок в атомы. Если до завершения всех правок возникает ошибка, транзакцию можно отменить.
- База геоданных поддерживает дополнительные стеки отмены и повторения для операций редактирования. После остановки операции редактирования она помещается в стек отмены. Стек отмены/повтора можно обходить с помощью undoOperation и redoOperation.
- Сеансы и операции редактирования позволяют выполнять пакетные обновления, что значительно повышает производительность при редактировании баз геоданных ArcSDE.
- В базах геоданных, поддерживающих одновременное редактирование несколькими пользователями, приложение в сеансе редактирования не будет распознавать изменений, внесенных другими приложениями, до тех пор, пока этот сеанс редактирования не будет полностью завершен.
Класс Editor можно использовать для запуска и остановки сеансов и операций редактирования для файловых, личных баз геоданных, а также баз геоданных ArcSDE и шейп-файлов. Класс Editor можно использовать для запуска сеанса редактирования с версионными и неверсионными наборами данных.
Перед началом сеанса редактирования убедитесь, что открыты все наборы данных, которые будут редактироваться.
Метод startEditing используется для запуска сеанса редактирования, а метод startOperation используется для запуска операции редактирования. Чтобы завершить операцию редактирования, вызовите метод stopOperation. Чтобы отменить операцию редактирования, вызовите метод abortOperation. Чтобы завершить сеанс редактирования, вызовите метод stopEditing, который принимает логический параметр, определяющий, будут ли приняты или отклонены изменения, внесенные в течение сеанса.
Невыполнение этого правила может привести к неожиданным результатам. Например, метод stopEditing не следует вызывать, пока выполняется операция редактирования. Вместо этого отмените операцию редактирования, а затем остановите сеанс редактирования.
Операции редактирования во время сеанса редактирования должны находиться под контролем, а операции редактирования не могут быть вложенными в другие операции редактирования.
Сеансы редактирования и операторы with
Сеансы и операции редактирования можно также использовать с операторами with Python. Операторы with действуют как менеджеры контекста и обрабатывают соответствующие вызовы для запуска, остановки и завершения работы. В примере ниже показана базовая структура класса Editor, используемая с операторами with.
import arcpy
# Open an edit session and start an edit operation
with arcpy.da.Editor(workspace) as edit:
<your edits>
# If an exception is raised, the operation will be aborted, and
# edit session is closed without saving
# If no exceptions are raised, stop the operation and save
# and close the edit session
Использование стеков отмены (undo) и повторного выполнения (redo)
Во время сеанса редактирования стеки отмены и повторного выполнения включаются или отключатся в зависимости от логического параметра метода startEditing. Если в процессе сеанса редактирования планируется несколько операций, которые могут быть условно отменены (и выполнены повторно), необходимо включить стеки отмены и повторного выполнения. Если же за сеанс выполняется, например, только одна операция), то стеки отмены и повторного выполнения можно отключить для повышения производительности, задав для этого параметра значение False.
При запуске версионного сеанса редактирования в ArcSDE стеки отмены и повторного выполнения будут всегда включены. Неверсионные сеансы не поддерживают операции отмены и повторного выполнения.
Стеки отмены и повторного выполнения управляются следующими двумя методами undoOperation и redoOperation. undoOperation возвращают состояние сеанса редактирования к последней операции редактирования и перемещает эту операцию редактирования в стек повторного выполнения. redoOperation перемещает операцию редактирования из стека повторного выполнения назад в стек отмены и «прокручивает» состояние сеанса редактирования вперед к тому состоянию, которое существовало после выполнения этой операции редактирования. При выполнении операции редактирования стек повторного выполнения (redo stack) очищается, после чего повторное выполнение (redo) любой операции, которая могла содержаться в стеке, становится невозможным.
Ситуации, требующие открытия сеанса редактирования
Далее представлены некоторые типы наборов данных, которые можно изменять только в ходе сеанса редактирования:
- Классы объектов, участвующие в топологии
- Классы объектов, участвующие в геометрической сети
- Версионные наборы данных в базах геоданных ArcSDE
- Определенные классы объектов и классы пространственных объектов с расширениями
Сеансы редактирования и курсоры
Для курсоров должна быть задана область в виде одной операции редактирования. Это значит, что для каждой операции должен создаваться новый экземпляр курсора. Это очень важно при изменении строк, возвращаемых курсором, так как строки связаны с определенным состоянием базы геоданных. Избегайте использования одного курсора в нескольких операциях редактирования. Это может привести к непредвиденному поведению и потере данных.
Синтаксис
Параметр | Объяснение | Тип данных |
workspace |
Путь к рабочей области для редактирования. Редактор может одновременно редактировать только одну рабочую область. | String |
Обзор метода
Метод | Объяснение |
__enter__ () |
Начинает сеанс редактирования. |
__exit__ () |
Если успешно, останавливает редактирование с сохранением изменений сеанса редактирования. Если исключение, останавливает редактирование без сохранения изменений. |
startEditing ({with_undo}, {multiuser_mode}) |
Начинает сеанс редактирования. |
stopEditing (save_changes) |
Останавливает сеанс редактирования. |
startOperation () |
Запускает операцию редактирования. |
stopOperation () |
Останавливает операцию редактирования. |
abortOperation () |
Прерывает операцию редактирования. |
undoOperation () |
Отменяет операцию редактирования (откат изменений). |
redoOperation () |
Отменяет операцию редактирования. |
Методы
Параметр | Объяснение | Тип данных |
with_undo |
Устанавливает включены или выключены стеки отмены и повторного выполнения в сеансе редактирования. Если в процессе сеанса редактирования планируется несколько операций, которые могут быть условно отменены (и выполнены повторно), необходимо включить стеки отмены и повторного выполнения. Если же за сеанс редактирования выполняется, например, только одна операция, то стеки отмены и повторного выполнения можно отключить для повышения производительности, задав для этого параметра значение False. При запуске версионного сеанса редактирования в ArcSDE стеки отмены и повторного выполнения будут всегда включены. Неверсионные сеансы не поддерживают операции отмены и повторного выполнения. (Значение по умолчанию — True) | Boolean |
multiuser_mode | При заданном значении параметра как False, у вас есть полный контроль редактирования неверсионного или версионного набора данных. Если набор данных является неверсионным, и вы используете параметр stopEditing(False), правка не будет подтверждена (в противном случае, если параметр установлен как True, то изменения будут зафиксированы). (Значение по умолчанию — True) | Boolean |
Параметр | Объяснение | Тип данных |
save_changes |
True, чтобы сохранить изменения; False для отмены изменений. (Значение по умолчанию — True) | Boolean |
Пример кода
В следующем коде используется оператор with, который начинает операцию редактирования и выполняет инструмент Вычислить поле (Сalculate Field) в выбранном наборе строк в таблице. Любые ошибки инструментов будут обработаны и распечатаны.
Поскольку инструмент Вычислить поле (Calculate Field) выполняется внутри оператора with, в случае каких-либо отклонений изменения не будут сохранены. Если инструмент Вычислить поле (Calculate Field) завершит работу успешно, то обновления будут сохранены.
import arcpy
fc = 'C:/Portland/Portland.gdb/Land/Parks'
workspace = 'C:/Portland/Portland.gdb'
layer_name = 'Parks'
try:
arcpy.MakeFeatureLayer_management(fc, layer_name)
arcpy.SelectLayerByAttribute_management(
layer_name, 'NEW_SELECTION', """CUSTODIAN = 'City of Portland'""")
with arcpy.da.Editor(workspace) as edit:
arcpy.CalculateField_management(layer_name, 'Usage', '"PUBLIC"',
'PYTHON')
except arcpy.ExecuteError:
print(arcpy.GetMessages(2))
Далее представлен пример запуска сеанса и операции редактирования, создания строки в таблице, затем остановки операции редактирования и завершения сеанса редактирования.
import arcpy
import os
fc = 'Database Connections/Portland.sde/portland.jgp.schools'
workspace = os.path.dirname(fc)
# Start an edit session. Must provide the worksapce.
edit = arcpy.da.Editor(workspace)
# Edit session is started without an undo/redo stack for versioned data
# (for second argument, use False for unversioned data)
edit.startEditing(False, True)
# Insert a row into the table.
with arcpy.da.InsertCursor(fc, ('SHAPE@', 'Name')) as icur:
icur.insertRow([(7642471.100, 686465.725), 'New School'])
# Stop the edit session and save the changes
edit.stopEditing(True)