Сводка
Класс Editor позволяет использовать сеансы и операции редактирования для управления транзакциями в базе данных.
Все внесенные изменения являются временными, пока вы не сохраните и не примените их к данным. Вы также можете выйти из сеанса редактирования, не сохраняя изменений.
Описание
Сеансы и операции редактирования имеют следующие преимущества:
- Группировка правок в атомарные структуры. Если до завершения всех правок возникает ошибка, транзакцию можно отменить.
- База геоданных поддерживает дополнительные стеки отмены и повторения для операций редактирования. После остановки операции редактирования она помещается в стек отмены. Пройти по стеку отмены/повтора можно с помощью методов undoOperation и redoOperation.
- Сеансы и операции редактирования позволяют выполнять пакетные обновления, что значительно повышает производительность при редактировании многопользовательских баз геоданных.
- В базах геоданных, поддерживающих одновременное редактирование несколькими пользователями, приложение в сеансе редактирования не будет распознавать изменений, внесенных другими приложениями, до тех пор, пока этот сеанс редактирования не будет полностью завершен.
Класс Editor можно использовать для запуска и остановки сеансов и операций редактирования для файловых и персональных баз геоданных, а также многопользовательских баз геоданных и шейп-файлов. Класс Editor можно использовать для запуска сеанса редактирования с версионными и неверсионными наборами данных.
Перед началом сеанса редактирования убедитесь, что открыты все наборы данных, которые будут редактироваться.
Метод startEditing используется для запуска сеанса редактирования, а метод startOperation используется для запуска операции редактирования. Чтобы завершить операцию редактирования, вызовите метод stopOperation. Чтобы отменить операцию редактирования, вызовите метод abortOperation. Чтобы завершить сеанс редактирования, вызовите метод stopEditing, который принимает Булев параметр, определяющий, будут ли приняты или отклонены изменения, внесенные в течение сеанса.
Примечание:
Невыполнение этого правила может привести к неожиданным результатам. Например, метод stopEditing не следует вызывать, пока выполняется операция редактирования. Вместо этого отмените операцию редактирования, а затем остановите сеанс редактирования.
Операции редактирования во время сеанса редактирования должны находиться под контролем, а операции редактирования не могут быть вложенными в другие операции редактирования.
Сеансы редактирования и операторы with
Сеансы и операции редактирования можно также использовать с операторами Python with. Операторы 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
# the 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.
Примечание:
При запуске версионного сеанса редактирования в многопользовательской базе геоданных стеки отмены и повторного выполнения будут всегда включены. Неверсионные сеансы не поддерживают операции отмены и повторного выполнения.
Существует два метода, которые контролируют стеки отмены и повтора: undoOperation и redoOperation. Метод undoOperation передвигает назад статус сеанса редактирования к последней операции изменения и перемещает операцию редактирования в стек повтора. Метод redoOperation перемещает операцию редактирования из верхней части стека повтора обратно в стек отмены и передвигает вперед статус сеанса редактирования к состоянию после выполнения операции изменения. При завершении операции редактирования стек повторного выполнения очищается, после чего повторное выполнение любой операции, которая могла содержаться в стеке, становится невозможным.
Ситуации, требующие открытия сеанса редактирования
Далее представлены некоторые типы наборов данных, которые можно изменять только в ходе сеанса редактирования:
- Классы объектов, участвующие в топологии
- Классы объектов, участвующие в геометрической сети
- Классы объектов, участвующие в наборе сетевых данных
- Версионные наборы данных в многопользовательских базах геоданных
- Определенные объекты и классы пространственных объектов с расширениями
Сеансы редактирования и курсоры
Для курсоров должна быть задана область в виде одной операции редактирования. Это значит, что для каждой операции должен создаваться новый экземпляр курсора. Это очень важно при изменении строк, возвращаемых курсором, так как строки связаны с определенным состоянием базы геоданных. Избегайте использования одного курсора в нескольких операциях редактирования. Это может привести к непредвиденному поведению и потере данных.
Синтаксис
Editor (workspace)
Parameter | Объяснение | Тип данных |
workspace | Путь к рабочей области для редактирования. Редактор может одновременно редактировать только одну рабочую область. | String |
Свойства
Владение | Объяснение | Тип данных |
isEditing (только чтение) | True, если Editor в сеансе редактирования. | Boolean |
Обзор метода
Метод | Объяснение |
__enter__ () | Начинает сеанс редактирования. |
__exit__ () | Если успешно, останавливает редактирование с сохранением изменений сеанса редактирования. Если исключение, останавливает редактирование без сохранения изменений. |
startEditing ({with_undo}, {multiuser_mode}) | Начинает сеанс редактирования. |
stopEditing (save_changes) | Останавливает сеанс редактирования. |
startOperation () | Запускает операцию редактирования. |
stopOperation () | Останавливает операцию редактирования. |
abortOperation () | Прерывает операцию редактирования. |
undoOperation () | Отменяет операцию редактирования (откат изменений). |
redoOperation () | Отменяет операцию редактирования. |
Методы
__enter__ ()
__exit__ ()
startEditing ({with_undo}, {multiuser_mode})
Parameter | Объяснение | Тип данных |
with_undo | Устанавливает включены или выключены стеки отмены и повторного выполнения в сеансе редактирования. Если в процессе сеанса редактирования планируется несколько операций, которые могут быть условно отменены (и выполнены повторно), необходимо включить стеки отмены и повторного выполнения. Если же за сеанс редактирования выполняется, например, только одна операция, то стеки отмены и повторного выполнения можно отключить для повышения производительности, задав для этого параметра значение False. При запуске версионного сеанса редактирования в ArcSDE стеки отмены и повторного выполнения будут всегда включены. Неверсионные сеансы не поддерживают операции отмены и повторного выполнения. (Значение по умолчанию — True) | Boolean |
multiuser_mode | При заданном значении параметра как False, у вас есть полный контроль редактирования неверсионного или версионного набора данных. Если набор данных является неверсионным, и вы используете параметр stopEditing(False), правка не будет подтверждена (в противном случае, если параметр установлен как True, то изменения будут зафиксированы). (Значение по умолчанию — True) | Boolean |
stopEditing (save_changes)
Parameter | Объяснение | Тип данных |
save_changes | True, чтобы сохранить изменения; False для отмены изменений. (Значение по умолчанию — True) | Boolean |
startOperation ()
stopOperation ()
abortOperation ()
undoOperation ()
redoOperation ()
Пример кода
В следующем коде используется выражение with, которое начинает операцию редактирования и выполняет CalculateField для выбранного набора строк в таблице. Любые ошибки инструмента будут обработаны и распечатаны.
Поскольку CalculateField выполняется внутри выражения with, в случае каких-либо отклонений изменения не будут сохранены. Если CalculateField завершает работу успешно, то обновления будут сохранены.
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 workspace.
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)
# Start an edit operation
edit.startOperation()
# 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 operation.
edit.stopOperation()
# Stop the edit session and save the changes
edit.stopEditing(True)