Zusammenfassung
Die Klasse "Editor" ermöglicht die Verwendung von Editiersitzungen und Bearbeitungsoperationen zum Verwalten von Datenbanktransaktionen.
Änderungen sind temporär, bis sie gespeichert und dauerhaft in die Daten übernommen werden. Sie können eine Editiersitzung auch beenden, ohne die Änderungen zu speichern.
Auswertung
Editiersitzungen und Bearbeitungsoperationen bieten die folgenden Vorteile:
- Gruppieren von Bearbeitungen in atomaren Transaktionen. Tritt ein Fehler auf, bevor alle Bearbeitungen abgeschlossen sind, kann die Transaktion zurückgesetzt werden.
- Optionale Rückgängig- und Wiederholen-Stacks für Bearbeitungsoperationen in der Geodatabase. Angehaltene Bearbeitungsoperationen werden im Rückgängig-Stack platziert. Der Rückgängig-/Wiederholen-Stack kann 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 Klasse Editor kann zum Starten und Beenden von Editiersitzungen und Bearbeitungsoperationen für File-, Personal- und Enterprise-Geodatabases sowie Shapefiles verwendet werden. Die Klasse Editor kann zum Starten einer Editiersitzung mit versionierten und nicht versionierten Datasets verwendet werden.
Stellen Sie vor dem Starten einer Editiersitzung sicher, dass alle zu bearbeitenden Datasets geöffnet wurden.
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.
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 der Python-Anweisung with 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) 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
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 umfasst, die möglicherweise rückgängig gemacht (und wiederholt) werden, sollten die Rückgängig- und Wiederholen-Stacks aktiviert werden. 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.
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 Editiersitzungen erforderlich sind
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. Für jede Operation sollte also ein neuer Cursor instanziiert und freigegeben werden. Dies ist sehr wichtig beim Bearbeiten von Zeilen, die von einem Cursor zurückgegeben werden, da die Zeilen mit einem bestimmten Zustand der Geodatabase verknüpft sind. Das Verwenden eines Cursors für mehrere Bearbeitungsoperationen sollte vermieden werden. Dies kann zu unerwartetem Verhalten und Datenverlusten führen.
Syntax
Editor (workspace)
Parameter | Erklärung | Datentyp |
workspace | Path to the workspace to edit. Editor can edit only one workspace at a time. | String |
Eigenschaften
Eigenschaft | Erklärung | Datentyp |
isEditing (Nur lesen) | True if the Editor is in an edit session. | Boolean |
Methodenübersicht
Methode | Erklärung |
__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})
Parameter | Erklärung | Datentyp |
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)
Parameter | Erklärung | Datentyp |
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 und CalculateField für eine Reihe ausgewählter Zeilen in einer Tabelle durchgeführt wird. Etwaige auftretende Werkzeugfehler werden verarbeitet und ausgegeben.Da CalculateField innerhalb einer with-Anweisung ausgeführt wird, werden Änderungen im Falle von Ausnahmen 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'
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 - Beispiel 2
Unten sehen Sie ein Beispiel für das Starten einer Editiersitzung und einer Bearbeitungsoperation, das Erstellen einer Zeile in einer Tabelle sowie das Beenden der Bearbeitungsoperation und Übergeben der Editiersitzung.
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)