Краткая информация
Класс Editor позволяет использовать сеансы и операции редактирования для управления транзакциями в базе данных.
Изменения выполняются поэтапно и не сохраняются в данных до тех пор, пока они не будут запущены. Это позволяет лучше контролировать возникновение ошибок при выполнении одной или нескольких операций редактирования.
Обсуждение
Сеансы и операции редактирования имеют следующие преимущества:
- Группировка правок в атомарные структуры. Если до завершения всех правок возникает ошибка, редактирование и транзакцию можно отменить.
- База геоданных поддерживает дополнительные стеки отмены и повторения для операций редактирования. После остановки операции редактирования она помещается в стек отмены. Пройти по стеку отмены/повтора можно с помощью методов undoOperation и redoOperation.
- Сеансы и операции редактирования позволяют выполнять пакетные обновления, что значительно повышает производительность при редактировании многопользовательских баз геоданных.
- В базах геоданных, поддерживающих одновременное редактирование несколькими пользователями, приложение в сеансе редактирования не будет распознавать изменений, внесенных другими приложениями, до тех пор, пока этот сеанс редактирования не будет полностью завершен.
Класс Editor можно использовать для запуска и остановки сеансов и операций редактирования для файловых и персональных баз геоданных, а также многопользовательских баз геоданных и шейп-файлов.
Метод startEditing используется для запуска сеанса редактирования, а метод startOperation используется для запуска операции редактирования. Чтобы завершить операцию редактирования, вызовите метод stopOperation. Чтобы отменить операцию редактирования, вызовите метод abortOperation. Чтобы завершить сеанс редактирования, вызовите метод stopEditing, который принимает Булев параметр, определяющий, будут ли приняты или отклонены изменения, внесенные в течение сеанса.
Примечание:
Невыполнение этого правила может привести к неожиданным результатам. Например, метод stopEditing не следует вызывать, пока выполняется операция редактирования. Вместо этого отмените операцию редактирования, а затем остановите сеанс редактирования.
Операции редактирования во время сеанса редактирования должны находиться под контролем, а операции редактирования не могут быть вложенными в другие операции редактирования.
Сеансы редактирования и операторы with
Сеансы и операции редактирования можно также использовать с операторами 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 перемещает операцию редактирования из верхней части стека повтора обратно в стек отмены и передвигает вперед статус сеанса редактирования к состоянию после выполнения операции изменения. При завершении операции редактирования стек повторного выполнения очищается, после чего повторное выполнение любой операции, которая могла содержаться в стеке, становится невозможным.
Ситуации, требующие открытия сеанса редактирования
Далее представлены некоторые типы наборов данных, которые можно изменять только в ходе сеанса редактирования:
- Классы объектов, участвующие в топологии
- Классы объектов, участвующие в геометрической сети
- Классы объектов, участвующие в наборе сетевых данных
- Версионные наборы данных в многопользовательских базах геоданных
- Определенные объекты и классы пространственных объектов с расширениями
Сеансы редактирования и курсоры
Для курсоров должна быть задана область в виде одной операции редактирования. Это значит, что для каждой операции должен создаваться новый экземпляр курсора. Это очень важно при изменении строк, возвращаемых курсором, так как строки связаны с определенным состоянием базы геоданных. Избегайте использования одного курсора в нескольких операциях редактирования. Это может привести к непредвиденному поведению и потере данных.
Редактирование сеансов и версионных данных
Таблицы и классы объектов многопользовательских баз геоданных могут быть версионными. Свойство isVersioned можно использовать для определения, являются ли таблица или класс пространственных объектов версионными.
При редактировании таблиц и классов объектов многопользовательской базы геоданных режим сеанса редактирования должен быть установлен в соответствии с типом редактируемых данных:
- При редактировании неверсионных таблицы или класса объектов задайте для аргумента multiuser_mode значение False.
- При редактировании версионных таблицы или класса объектов задайте для аргумента multiuser_mode значение True.
Используйте либо класс Editor, либо задайте multiuser_mode для метода startEditing класса Editor.
Если многопользовательский режим настроен неправильно, вы можете получить сообщение об ошибке, говорящей о том, что объекты этого класса не могут быть обновлены вне сеанса редактирования.
Синтаксис
Editor (workspace, {multiuser_mode})
Параметр | Описание | Тип данных |
workspace | Path to the workspace to edit. The editor can edit only one workspace at a time. | String |
multiuser_mode | When edits will be performed on versioned data, set this to True; otherwise, set it to False. Only use with enterprise geodatabases. (Значение по умолчанию — True) | Boolean |
Свойства
Свойство | Описание | Тип данных |
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 ()
Пример кода
В следующем коде используется выражение with, которое начинает операцию редактирования и использует функцию CalculateField для выбранного набора строк в таблице. Любые ошибки инструмента будут обработаны и распечатаны.
Поскольку функция CalculateField выполняется внутри выражения with, в случае каких-либо отклонений изменения не будут сохранены. Если CalculateField завершает работу успешно, то обновления будут сохранены.
import arcpy
fc = 'C:/Portland/Portland.gdb/Land/Parks'
workspace = 'C:/Portland/Portland.gdb'
layer_name = 'Parks'
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')
Ниже представлен пример запуска сеанса и операции редактирования, создания строки в таблице, затем остановки операции редактирования и завершения сеанса редактирования.
import arcpy
import os
fc = 'C:/projects/Portland/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
# Set multiuser_mode to False if working with unversioned enterprise gdb data
edit.startEditing(with_undo=False, multiuser_mode=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(save_changes=True)
Ниже приводится пример использования класса Editor в качестве контекстной программы с версионными данными.
import arcpy
import os
new_students = 'C:/projects/Portland/Portland.sde/ptld.main.students_new2022'
students = 'C:/projects/Portland/Portland.sde/ptld.main.students'
# Start an edit session. Provide the workspace being acted on
# and with sde specify if data is edited in multiuser_mode.
with arcpy.da.Editor(os.path.dirname(students), multiuser_mode=True):
# If all 3 edit operations run successfully without error
# upon exiting this code block the edits will be applied to the data
arcpy.management.CalculateField(new_students , 'arrived', '2022')
arcpy.management.Append(new_students, students)
arcpy.management.CalculateField(students, "active", True)