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 startEditing-Methode wird zum Starten einer Editiersitzung verwendet, und die startOperation-Methode wird zum Starten einer Bearbeitungsoperation verwendet. 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. Diese Methode akzeptiert einen booleschen Parameter, der angibt, ob die in der Sitzung vorgenommenen Änderungen übernommen oder verworfen werden sollen.
Hinweis:
Das Abweichen von diesem Muster kann zu unerwarteten Ergebnissen führen. Beispielsweise sollte stopEditing nicht aufgerufen werden, während eine Bearbeitungsoperation ausgeführt wird. 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 fungieren als Kontext-Manager und übernehmen die entsprechenden Aufrufe zum Starten, Beenden und Abbrechen für Sie. Im folgenden Beispiel wird die grundlegende Struktur der Editor-Klasse bei Verwendung mit with-Anweisungen hervorgehoben.
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 für eine Editiersitzung abhängig vom booleschen Parameter der startEditing-Methode aktiviert oder 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 zwei Methoden gesteuert: undoOperation und redoOperation. Mit undoOperation wird der Zustand der Editiersitzung auf die letzte Bearbeitungsoperation zurückgesetzt und die Bearbeitungsoperation in den Wiederholen-Stack verschoben. Mit der redoOperation-Methode wird eine Bearbeitungsoperation von ihrer Position oben auf dem Wiederholen-Stack auf den Rückgängig-Stack verschoben, und der Zustand der Editiersitzung wird auf den Zustand nach der Ausführung der Bearbeitungsoperation gesetzt. 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})
Parameter | Erläuterung | Datentyp |
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
Eigenschaft | Erläuterung | Datentyp |
isEditing (Schreibgeschützt) | True if the Editor is in an edit session. | Boolean |
Methodenübersicht
Methode | Erlä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})
Parameter | Erläuterung | 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 | Erläuterung | Datentyp |
save_changes | Specifies whether to save or discard changes. (Der Standardwert ist True) | Boolean |
startOperation ()
stopOperation ()
abortOperation ()
undoOperation ()
redoOperation ()
Codebeispiel
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.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')
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)
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)