Editor

Zusammenfassung

Die Editor-Klasse ermöglicht die Verwendung von Editiersitzungen und Bearbeitungsoperationen zum Verwalten von Datenbanktransaktionen.

Bearbeitungen werden bereitgestellt und erst an die Daten übergeben, wenn die Übergabe ausgelöst wird. Dies ermöglicht eine bessere Steuerung, wenn innerhalb einer Bearbeitungsoperation oder in mehreren Bearbeitungsoperationen Fehler auftreten.

Diskussion

Editiersitzungen und Bearbeitungsoperationen bieten die folgenden Vorteile:

  • Gruppieren von Bearbeitungen in atomaren Transaktionen. Wenn vor Abschluss aller Bearbeitungen ein Fehler auftritt, können die Bearbeitungen verworfen werden, und die Transaktion kann zurückgesetzt werden.
  • In der Geodatabase werden optionale Rückgängig-Stacks und Wiederholen-Stacks für Bearbeitungsoperationen verwaltet. Angehaltene Bearbeitungsoperationen werden im Rückgängig-Stack platziert. Die Rückgängig- und Wiederholen-Stacks können durch Aufrufen der Methoden undoOperation und redoOperation durchlaufen werden.
  • Editiersitzungen und Bearbeitungsoperationen ermöglichen Batch-Aktualisierungen, die bei der Bearbeitung von Enterprise-Geodatabases erhebliche Performance-Vorteile bieten.
  • In Geodatabases, bei denen mehrere Benutzer gleichzeitig Bearbeitungen vornehmen können, werden von einer Anwendung in einer Editiersitzung Änderungen, die durch andere Anwendungen durchgeführt werden, erst nach Abschluss der Editiersitzung erkannt.

Die Editor-Klasse kann verwendet werden, um getrennte Editiersitzungen und Bearbeitungsoperationen für Geodatabases und Shapefiles zu starten und zu beenden.

Die Methode startEditing dient zum Starten einer Editiersitzung, und die Methode startOperation dient zum Starten einer Bearbeitungsoperation. Um eine Bearbeitungsoperation zu übergeben, rufen Sie stopOperation auf. Um eine Bearbeitungsoperation abzubrechen, rufen Sie abortOperation auf. Um eine Editiersitzung abzuschließen, rufen Sie stopEditing auf. Dadurch wird ein boolescher Parameter übernommen, der angibt, oder die in der Sitzung vorgenommenen Änderungen übergeben oder verworfen werden sollen.

Hinweis:

Das Abweichen von diesem Muster kann zu unerwarteten Ergebnissen führen. stopEditing sollte beispielsweise nicht während einer laufenden Bearbeitungsoperation aufgerufen werden. Brechen Sie stattdessen die Bearbeitungsoperation ab, und beenden Sie die Editiersitzung.

Bearbeitungsoperationen müssen im Kontext einer Editiersitzung gesteuert werden und können nicht in andere Bearbeitungsoperationen geschachtelt werden.

Editiersitzungen und with-Anweisungen

Editiersitzungen und Bearbeitungsoperationen können auch mit with-Anweisungen verwendet werden. Die with-Anweisungen dienen als Kontext-Manager und verarbeiten die Start-, Stopp- und Abbruch-Aufrufe. Das Beispiel unten zeigt die grundlegende Struktur der Klasse Editor in Verbindung mit with-Anweisungen.

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 will be aborted, and the edit
    # session is closed without saving.

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

Verwenden der Rückgängig- und Wiederholen-Stacks

Die Rückgängig- und Wiederholen-Stacks sind in Abhängigkeit vom booleschen Parameter für die Methode startEditing für eine Editiersitzung aktiviert bzw. deaktiviert. Wenn eine Editiersitzung mehrere Operationen enthält, die auf Bedingungen basierend zurückgesetzt (und wiederholt) werden können, sollten die Rückgängig- und Wiederholen-Stacks aktiviert sein. Andernfalls – beispielsweise wenn die Editiersitzung nur eine Operation umfasst – können die Rückgängig- und Wiederholen-Stacks zur Steigerung der Performance deaktiviert werden, indem der Parameter auf "False" gesetzt wird.

Hinweis:

Beim Starten einer versionierten Editiersitzung in einer Enterprise-Geodatabase werden die Rückgängig- und Wiederholen-Stacks aktiviert. Nicht versionierte Editiersitzungen bieten keine Unterstützung für die Operationen "Rückgängig" und "Wiederholen".

Die Rückgängig- und Wiederholen-Stacks werden mit den Methoden undoOperation und redoOperation gesteuert. Mit undoOperation wird der Status der Editiersitzung auf die letzte Bearbeitungsoperation zurückgesetzt und die Bearbeitungsoperation in den Wiederholen-Stack verschoben. Mit der Methode redoOperation wird eine Bearbeitungsoperation von der obersten Position des Wiederholen-Stacks zurück in den Rückgängig-Stack verschoben und die Editiersitzung wieder in den Zustand überführt, in dem sie sich vor dem Ausführen der Bearbeitungsoperation befand. Wenn eine Bearbeitungsoperation übergeben wird, wird der Wiederholen-Stack geleert. Die zuvor in diesem Stack enthaltenen Operationen können dann nicht mehr wiederholt werden.

Situationen, in denen eine Editiersitzung erforderlich ist

Nachstehend sind einige Dataset-Typen aufgeführt, die nur innerhalb einer Editiersitzung bearbeitet werden können:

  • Feature-Classes, die Teil einer Topologie sind
  • Feature-Classes, die an einem geometrischen Netzwerk beteiligt sind
  • Feature-Classes, die Teil eines Netzwerk-Datasets sind
  • Versionierte Datasets in Enterprise-Geodatabases
  • Einige Objekte und Feature-Classes mit Klassenerweiterungen

Editiersitzungen und Cursors

Cursors sollten auf eine einzige Bearbeitungsoperation festgelegt werden. Dies bedeutet, dass für jede Operation ein neuer Cursor instanziiert und freigegeben werden sollte. Sehr wichtig ist dies beim Bearbeiten von Zeilen, die von einem Cursor zurückgegeben wurden, da die Zeilen an einen bestimmten Zustand der Geodatabase gebunden sind. Das Verwenden eines Cursors für mehrere Bearbeitungsoperationen sollte vermieden werden. Dies kann zu unerwartetem Verhalten und zu Datenverlusten führen.

Editiersitzungen und versionierte Daten

Enterprise-Geodatabase-Tabellen und Feature-Classes von Enterprise-Geodatabases können versioniert sein. Mit der isVersioned-Eigenschaft kann ermittelt werden, ob eine Tabelle oder Feature-Class versioniert ist.

Beim Bearbeiten von Enterprise-Geodatabase-Tabellen und Feature-Classes von Enterprise-Geodatabases sollte der Modus der Editiersitzung gemäß dem Typ der bearbeiteten Daten festgelegt werden:

  • Legen Sie beim Bearbeiten einer nicht versionierten Tabelle oder Feature-Class das multiuser_mode-Argument auf "False" fest.
  • Legen Sie beim Bearbeiten einer versionierten Tabelle oder Feature-Class das multiuser_mode-Argument auf "True" fest.

Verwenden Sie die Editor-Klasse oder die startEditing-Methode der Editor-Klasse, um multiuser_mode festzulegen.

Wenn der Mehrbenutzermodus nicht richtig festgelegt ist, wird möglicherweise eine Fehlermeldung angezeigt. Diese besagt, dass Objekte in dieser Klasse nicht außerhalb einer Editiersitzung aktualisiert werden können.

Syntax

 Editor (workspace, {multiuser_mode})
ParameterErläuterungDatentyp
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.

(Der Standardwert ist True)

Boolean

Eigenschaften

EigenschaftErläuterungDatentyp
isEditing
(Schreibgeschützt)

True if the Editor is in an edit session.

Boolean

Methodenübersicht

MethodeErläuterung
__enter__ ()

Starts an edit session.

__exit__ ()

If successful, stops editing and saves an edit session. If an exception, stops editing and doesn't save.

startEditing ({with_undo}, {multiuser_mode})

Starts an edit session.

stopEditing (save_changes)

Stops an edit session.

startOperation ()

Starts an edit operation.

stopOperation ()

Stops an edit operation.

abortOperation ()

Aborts an edit operation.

undoOperation ()

Undo an edit operation (roll back modifications).

redoOperation ()

Redoes an edit operation.

Methoden

__enter__ ()
__exit__ ()
startEditing ({with_undo}, {multiuser_mode})
ParameterErläuterungDatentyp
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.

(Der Standardwert ist 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).

(Der Standardwert ist True)

Boolean
stopEditing (save_changes)
ParameterErläuterungDatentyp
save_changes

Specifies whether to save or discard changes.

(Der Standardwert ist True)

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

Codebeispiel

Editor - Beispiel 1

Im folgenden Code wird eine with-Anweisung verwendet, mit der eine Bearbeitungsoperation gestartet wird, und die CalculateField-Funktion wird für eine ausgewählte Gruppe von Zeilen in einer Tabelle verwendet. Etwaige auftretende Werkzeugfehler werden verarbeitet und ausgegeben.

Da die CalculateField-Funktion innerhalb einer with-Anweisung ausgeführt wird, werden bei Auftreten von Ausnahmen Änderungen nicht gespeichert. Wenn CalculateField erfolgreich abgeschlossen wird, werden Aktualisierungen gespeichert.


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 - Beispiel 2

Im folgenden Beispiel werden eine Editiersitzung und eine Bearbeitungsoperation gestartet, eine Zeile in einer Tabelle erstellt und anschließend die Bearbeitungsoperation beendet und die Editiersitzung übergeben.

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 – Beispiel 3

Im folgenden Beispiel wird die Editor-Klasse als Kontext-Manager mit versionierten Daten verwendet.


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)

Verwandte Themen