Editor (arcpy.da)

Резюме

Класс Editor позволяет использовать сеансы и операции редактирования для управления транзакциями базы данных.

Все внесенные изменения являются временными, пока вы не сохраните и не примените их к данным. Вы также можете выйти из сеанса редактирования, не сохраняя изменений.

Обсуждение

Сеансы и операции редактирования имеют следующие преимущества:

Класс 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) любой операции, которая могла содержаться в стеке, становится невозможным.

Ситуации, требующие открытия сеанса редактирования

Далее представлены некоторые типы наборов данных, которые можно изменять только в ходе сеанса редактирования:

Сеансы редактирования и курсоры

Для курсоров должна быть задана область в виде одной операции редактирования. Это значит, что для каждой операции должен создаваться новый экземпляр курсора. Это очень важно при изменении строк, возвращаемых курсором, так как строки связаны с определенным состоянием базы геоданных. Избегайте использования одного курсора в нескольких операциях редактирования. Это может привести к непредвиденному поведению и потере данных.

Синтаксис

Editor (workspace)
ПараметрОбъяснениеТип данных
workspace

Путь к рабочей области для редактирования. Редактор может одновременно редактировать только одну рабочую область.

String

Обзор метода

МетодОбъяснение
__enter__ ()

Начинает сеанс редактирования.

__exit__ ()

Если успешно, останавливает редактирование с сохранением изменений сеанса редактирования. Если исключение, останавливает редактирование без сохранения изменений.

startEditing ({with_undo}, {multiuser_mode})

Начинает сеанс редактирования.

stopEditing (save_changes)

Останавливает сеанс редактирования.

startOperation ()

Запускает операцию редактирования.

stopOperation ()

Останавливает операцию редактирования.

abortOperation ()

Прерывает операцию редактирования.

undoOperation ()

Отменяет операцию редактирования (откат изменений).

redoOperation ()

Отменяет операцию редактирования.

Методы

__enter__ ()
__exit__ ()
startEditing ({with_undo}, {multiuser_mode})
ПараметрОбъяснениеТип данных
with_undo

Устанавливает включены или выключены стеки отмены и повторного выполнения в сеансе редактирования.

Если в процессе сеанса редактирования планируется несколько операций, которые могут быть условно отменены (и выполнены повторно), необходимо включить стеки отмены и повторного выполнения. Если же за сеанс редактирования выполняется, например, только одна операция, то стеки отмены и повторного выполнения можно отключить для повышения производительности, задав для этого параметра значение False.

При запуске версионного сеанса редактирования в ArcSDE стеки отмены и повторного выполнения будут всегда включены. Неверсионные сеансы не поддерживают операции отмены и повторного выполнения.

(Значение по умолчанию — True)

Boolean
multiuser_mode

При заданном значении параметра как False, у вас есть полный контроль редактирования неверсионного или версионного набора данных. Если набор данных является неверсионным, и вы используете параметр stopEditing(False), правка не будет подтверждена (в противном случае, если параметр установлен как True, то изменения будут зафиксированы).

(Значение по умолчанию — True)

Boolean
stopEditing (save_changes)
ПараметрОбъяснениеТип данных
save_changes

True, чтобы сохранить изменения; False для отмены изменений.

(Значение по умолчанию — True)

Boolean
startOperation ()
stopOperation ()
abortOperation ()
undoOperation ()
redoOperation ()

Пример кода

Пример класса Editor 1

В следующем коде используется оператор 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))
Пример класса 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 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)

Связанные темы

9/10/2013