Сводка
Класс Editor позволяет использовать сеансы и операции редактирования для управления транзакциями в базе данных.
Все внесенные изменения являются временными, пока вы не сохраните и не примените их к данным. Вы также можете выйти из сеанса редактирования, не сохраняя изменений.
Описание
Сеансы и операции редактирования имеют следующие преимущества:
- Группировка правок в атомарные структуры. Если до завершения всех правок возникает ошибка, транзакцию можно отменить.
- База геоданных поддерживает дополнительные стеки отмены и повторения для операций редактирования. После остановки операции редактирования она помещается в стек отмены. Пройти по стеку отмены/повтора можно с помощью методов undoOperation и redoOperation.
- Сеансы и операции редактирования позволяют выполнять пакетные обновления, что значительно повышает производительность при редактировании многопользовательских баз геоданных.
- В базах геоданных, поддерживающих одновременное редактирование несколькими пользователями, приложение в сеансе редактирования не будет распознавать изменений, внесенных другими приложениями, до тех пор, пока этот сеанс редактирования не будет полностью завершен.
Класс Editor можно использовать для запуска и остановки сеансов и операций редактирования для файловых и персональных баз геоданных, а также многопользовательских баз геоданных и шейп-файлов. Класс Editor можно использовать для запуска сеанса редактирования с версионными и неверсионными наборами данных.
Перед началом сеанса редактирования убедитесь, что открыты все наборы данных, которые будут редактироваться.
Метод startEditing используется для запуска сеанса редактирования, а метод startOperation используется для запуска операции редактирования. Чтобы завершить операцию редактирования, вызовите метод stopOperation. Чтобы отменить операцию редактирования, вызовите метод abortOperation. Чтобы завершить сеанс редактирования, вызовите метод 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)
Параметр | Объяснение | Тип данных |
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})
Параметр | Объяснение | Тип данных |
with_undo | Sets whether the undo and redo stacks are enabled or disabled for an edit session. If an edit session will contain multiple operations that might be conditionally rolled back (and redone), the undo and redo stacks should be enabled. If not—for example, if the edit session will only contain a single operation—the undo and redo stacks can be disabled for performance benefits by setting the argument to false. When starting a versioned edit session in enterprise geodatabase, the undo and redo stacks will always be enabled. Nonversioned edit sessions do not support undo and redo operations. (Значение по умолчанию — True) | Boolean |
multiuser_mode | When False, you have full control of editing a nonversioned, or versioned dataset. If your dataset is nonversioned and you use stopEditing(False), your edit will not be committed (otherwise, if set to True, your edits will be committed). (Значение по умолчанию — True) | Boolean |
stopEditing (save_changes)
Параметр | Объяснение | Тип данных |
save_changes | Specifies whether to save or discard changes. (Значение по умолчанию — True) | Boolean |
startOperation ()
stopOperation ()
abortOperation ()
undoOperation ()
redoOperation ()
Пример кода
Класс Editor. Пример 1
В следующем коде используется выражение 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))
Класса Editor. Пример 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)