Editor

Краткая информация

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

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

Обсуждение

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

  • Группировка правок в атомарные структуры. Если до завершения всех правок возникает ошибка, редактирование и транзакцию можно отменить.
  • База геоданных поддерживает дополнительные стеки отмены и повторения для операций редактирования. После остановки операции редактирования она помещается в стек отмены. Пройти по стеку отмены/повтора можно с помощью методов undoOperation и redoOperation.
  • Сеансы и операции редактирования позволяют выполнять пакетные обновления, что значительно повышает производительность при редактировании многопользовательских баз геоданных.
  • В базах геоданных, поддерживающих одновременное редактирование несколькими пользователями, приложение в сеансе редактирования не будет распознавать изменений, внесенных другими приложениями, до тех пор, пока этот сеанс редактирования не будет полностью завершен.

Класс Editor можно использовать для запуска и остановки сеансов и операций редактирования для файловых и персональных баз геоданных, а также многопользовательских баз геоданных и шейп-файлов.

Метод startEditing используется для запуска сеанса редактирования, а метод startOperation используется для запуска операции редактирования. Чтобы завершить операцию редактирования, вызовите метод stopOperation. Чтобы отменить операцию редактирования, вызовите метод abortOperation. Чтобы завершить сеанс редактирования, вызовите метод stopEditing, который воспринимает Булев параметр, указывающий, будут ли внесенные изменения приняты или отменены.

Примечание:

Невыполнение этого правила может привести к неожиданным результатам. Например, не следует вызывать stopEditing, пока выполняется операция редактирования. Вместо этого отмените операцию редактирования, а затем остановите сеанс редактирования.

Операции редактирования во время сеанса редактирования должны находиться под контролем, а операции редактирования не могут быть вложенными в другие операции редактирования.

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

Сеансы и операции редактирования можно также использовать с операторами with. Операторы with действуют как контекстная программа и обрабатывают соответствующие вызовы start, stop и abort. В примере ниже показана базовая структура класса Editor, используемая с операторами with.

import arcpy

# Open an edit session and start an edit operation
with arcpy.da.Editor(workspace):
    print('<your edits go here>')

    # If an exception is raised, the operation is cancelled, and the edit
    # session is closed without saving.

    # If no exceptions are raised, the operation stops, is saved, and the edit
    # session closes.

Используйте стеки отмены (undo) и повторного выполнения (redo)

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

Примечание:

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

Существует два метода, которые контролируют стеки отмены и повтора: undoOperation и redoOperation. Метод undoOperation передвигает назад статус сеанса редактирования к последней операции изменения и перемещает операцию редактирования в стек повтора. Метод redoOperation перемещает операцию редактирования из верхней части стека повторного выполнения обратно в стек отмены и переводит состояние сеанса редактирования в то состояние, в котором оно было после операции редактирования. При завершении операции редактирования стек повторного выполнения очищается, после чего повторное выполнение любой операции, которая могла содержаться в стеке, становится невозможным.

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

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

  • Классы объектов, участвующие в топологии
  • Классы объектов, участвующие в геометрической сети
  • Классы объектов, участвующие в наборе сетевых данных
  • Версионные наборы данных в многопользовательских базах геоданных
  • Определенные объекты и классы пространственных объектов с расширениями

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

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

Редактирование сеансов и версионных данных

Таблицы и классы объектов многопользовательских баз геоданных могут быть версионными. Свойство isVersioned можно использовать для определения, являются ли таблица или класс пространственных объектов версионными.

При редактировании таблиц многопользовательской базы геоданных и классов пространственных объектов режим сеанса редактирования должен быть установлен в соответствии с типом редактируемых данных следующим образом:

  • При редактировании неверсионных таблиц или классов объектов задайте для аргумента multiuser_mode значение False.
  • При редактировании версионных таблиц или классов объектов задайте для аргумента multiuser_mode значение True.

Чтобы установить многопользовательский режим, используйте либо класс Editor с аргументом multiuser_mode, либо класс Editor метода startEditing с аргументом multiuser_mode.

Если многопользовательский режим настроен неправильно, вы можете получить сообщение об ошибке, говорящее о том, что объекты этого класса не могут быть обновлены вне сеанса редактирования.

Синтаксис

 Editor (workspace, {multiuser_mode}, {version})
ПараметрОписаниеТип данных
workspace

The path to the workspace to edit. The editor can edit only one workspace at a time.

The following are valid inputs:

  • The path to a workspace, for example: r"c:\myProj\f.gdb" or r"c:\myProj\db.sde".
  • An arcpy.Describe object. This can be the result of describing a workspace, or the workspace property returned by describing a layer, table, or feature class, for example: arcpy.Describe(fc).workspace.
  • An arcpy.mp.Layer object.

Примечание:

If the value provided has an associated version, the edit session will use that version. This can be overridden with the version argument.

Object
multiuser_mode

Specifies how edits will be applied to the data source when editing an enterprise geodatabase. For any other data source, including a feature service with version management enabled, this parameter will be ignored.

To allow editing on versioned data, set this parameter to True. Nonversioned data can be edited with the parameter set to either True or False.

When this parameter is set to True, the following will occur:

  • For versioned data, the undoOperation and redoOperation methods are supported, as well as saving or discarding the edit session.
  • For nonversioned data (for example, nonversioned archived or unversioned) the edits created in the edit session can be saved or discarded. Neither the undoOperation or redoOperation methods are supported with nonversioned data.

When this parameter is set to False, the following will occur:

  • For versioned data, an error will occur when attempting to edit.
  • For nonversioned data, edits will be committed when stopEditing(True) or rolled back when stopEditing(False).

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

Boolean
version

The workspace's version that will be associated with the edit session.

  • This parameter overrides the version associated with the value set using the workspace parameter.
  • When the workspace does not have a version that matches the name provided, a RuntimeError exception will be raised.

String

Свойства

СвойствоОписаниеТип данных
isEditing
(только чтение)

Указывает, находится ли объект Editor в сеансе редактирования.

Boolean
version
(только чтение)

Для рабочей области, поддерживающей управление версиями, это - имя версии рабочей области, которая связана с данным объектом.

Значением этого параметра будет None, если оно не применяется.

String
workspacePath
(только чтение)

Путь к рабочей области, связанной с данным объектом.

String

Обзор метода

МетодОписание
__enter__ ()

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

__exit__ ()

В случае успеха, объект Editor прекращает редактирование и сохраняет сеанс редактирования. В случае возникновения исключения редактирование прекращается, но изменения не сохраняются.

startEditing ({with_undo}, {multiuser_mode})

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

stopEditing ({save_changes})

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

startOperation ()

Начинает операцию редактирования.

stopOperation ()

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

abortOperation ()

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

undoOperation ()

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

redoOperation ()

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

Методы

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

Specifies whether the undo and redo stacks will be enabled or disabled for an edit session.

If an edit session will contain multiple operations that might be conditionally rolled back (and redone), enable the undo and redo stacks by setting this argument to True. 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 this argument to False.

When starting a versioned edit session in an 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

Specifies whether multiuser mode is enabled. When set to False, you have full control of editing a nonversioned or versioned dataset. If the dataset is nonversioned and you use stopEditing(False), the edits will not be committed (if set to True, the edits will be committed).

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

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

Specifies whether the edits will be saved or discarded.

(Значение по умолчанию — 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'

arcpy.management.MakeFeatureLayer(fc, layer_name)
arcpy.management.SelectLayerByAttribute(
    layer_name, 'NEW_SELECTION',
    """CUSTODIAN = 'City of Portland'""")

with arcpy.da.Editor(workspace):
    arcpy.management.CalculateField(layer_name, 'Usage', '"PUBLIC"', 'PYTHON')
Editor, пример 2

Ниже представлен пример запуска сеанса и операции редактирования, создания строки в таблице, затем остановки операции редактирования и завершения сеанса редактирования.

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, пример 3

Ниже приводится пример использования класса 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'

workspace = arcpy.Describe(students).workspace

# 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(workspace, 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)
Editor, пример 4

Ниже показан рекомендуемый шаблон использования класса Editor в инструментах-скриптах.


import arcpy

# arcpy.GetParameter(0) could be a feature class or layer in a map.
# If the dataset's workspace is versioned, the editor will use the same version
in_features = arcpy.GetParameter(0)
workspace = arcpy.Describe(in_features).workspace

with arcpy.da.Editor(workspace):
    # Perform edit operations here.
    print('Perform edit operations here')

Связанные разделы