Resumen
La clase Editor permite el uso de sesiones de edición y operaciones para administrar transacciones de base de datos.
Las ediciones se almacenan provisionalmente y no se confirman en los datos hasta que se desencadenen. Por tanto, permite controlar mejor si se producen errores dentro de una operación de edición o en varias operaciones de edición.
Debate
Las operaciones y sesiones de edición ofrecen estas ventajas:
- Ediciones de grupos en transacciones atómicas. Si se produce un error antes de completar todas las ediciones, puede que las ediciones se descarten y se deshaga la transacción.
- La geodatabase mantiene pilas de deshacer y rehacer para las operaciones de edición. Tras detener una operación de edición, se coloca en la pila de acciones para deshacer. Las pilas de deshacer y rehacer se pueden recorrer mediante llamadas a los métodos undoOperation y redoOperation.
- Las operaciones y sesiones de edición permiten las actualizaciones por lotes, lo que ofrece ventajas de rendimiento significativas al editar geodatabases corporativas.
- En el caso de las geodatabases que permiten que varios usuarios editen al mismo tiempo, una aplicación en una sesión de edición no reconocerá los cambios que hagan otras aplicaciones hasta que la sesión esté completa.
Se puede utilizar la clase Editor para iniciar y detener distintas sesiones y operaciones de edición para geodatabases y shapefiles.
El método startEditing se utiliza para iniciar una sesión de edición y el método startOperation se utiliza para iniciar una operación de edición. Para confirmar una operación de edición, llame a stopOperation. Para cancelar una operación de edición, llame a abortOperation. Para completar una sesión de edición, llame a stopEditing, que acepta un parámetro booleano que indica si los cambios realizados en la sesión se deben confirmar o descartar.
Nota:
Desviarse de este patrón puede generar resultados inesperados. Por ejemplo, stopEditing no se debería llamar mientras hay una operación de edición en curso. En su lugar, cancele la operación de edición y detenga la sesión de edición.
Es necesario controlar las operaciones de edición en el contexto de una sesión de edición, y las operaciones de edición no se pueden anidar dentro de otras operaciones de edición.
Sesiones de edición con sentencias
Las sesiones de edición y las operaciones también se pueden utilizar con sentencias with. Las sentencias with actúan como administradores de contexto y manejan las llamadas de inicio, detención y anulación adecuadas por usted. El siguiente ejemplo resalta la estructura básica de la clase Editor utilizada con las sentencias 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
# the edit session is closed without saving
# If no exceptions are raised, stop the operation and save
# and close the edit session
Utilizar las pilas de deshacer y rehacer
Las pilas de deshacer y rehacer están habilitadas o deshabilitadas para una sesión de edición en función del parámetro booleano del método startEditing. Si una sesión de edición contiene varias operaciones que se puedan deshacer (y rehacer) condicionalmente, las pilas de deshacer y rehacer deberían estar habilitadas. De lo contrario (por ejemplo, si la sesión de edición solo va a contener una única operación), las pilas de acciones para deshacer y rehacer se pueden deshabilitar para obtener ventajas de rendimiento al definir el parámetro como False.
Nota:
Al iniciar una sesión de edición versionada en una geodatabase corporativa, se habilitan las pilas de deshacer y rehacer. Las sesiones de edición no versionadas no admiten las operaciones de deshacer y rehacer.
Los dos métodos que controlan las pilas de deshacer y rehacer son undoOperation y redoOperation. undoOperation deshace el estado de la sesión de edición a la última operación de edición y mueve la operación de edición a la pila de rehacer. El método redoOperation mueve una operación de edición de la parte superior de la pila de rehacer a la lista de acciones de deshacer y hace avanzar el estado de la sesión de edición a la situación que tenía después de la ejecución de la operación de edición. Cuando se confirma una operación de edición, la pila de acciones para rehacer se vacía, por lo que no es posible rehacer las operaciones que pudiesen estar en la pila de acciones para rehacer.
Situaciones que requieren una sesión de edición
A continuación, se incluyen algunos tipos de datasets que solo se pueden editar en una sesión de edición:
- Clases de entidad que forman parte de una topología
- Clases de entidad que forman parte de una red geométrica
- Clases de entidad que forman parte de un dataset de red
- Datasets versionados en geodatabases corporativas
- Algunas clases de entidad y objetos con extensiones de clase
Cursores y sesiones de edición
El alcance de un cursor debe ser una única operación de edición. Significa que se debe instanciar y liberar un nuevo cursor para cada operación. Es muy importante hacerlo al editar filas devueltas por un cursor ya que las filas están vinculadas a un estado específico de la geodatabase. Evite utilizar un cursor en varias operaciones de edición. Si lo hace, puede provocar un comportamiento inesperado y una pérdida de datos.
Sesiones de edición y datos versionados
Las tablas de geodatabase corporativa y las clases de entidad podrían estar versionadas. Se puede usar la propiedad isVersioned para determinar si una tabla o clase de entidad está versionada.
Al editar tablas de geodatabase corporativa y clases de entidad, el modo de sesión de edición se debe establecer según el tipo de datos que se están editando:
- Al editar una tabla o clase de entidad no versionada, cambie el argumento multiuser_mode a False.
- Al editar una tabla o clase de entidad versionada, cambie el argumento multiuser_mode a True.
Utilice la clase Editor o el método startEditing de la clase Editor para establecer multiuser_mode.
Si el modo multiusuario no está definido correctamente, puede aparecer un error que indica que los objetos de esta clase no se pueden actualizar fuera de una sesión de edición.
Sintaxis
Editor (workspace, {multiuser_mode})
Parámetro | Explicación | Tipo de datos |
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. (El valor predeterminado es True) | Boolean |
Propiedades
Propiedad | Explicación | Tipo de datos |
isEditing (Sólo lectura) | True if the Editor is in an edit session. | Boolean |
Descripción general del método
Método | Explicación |
__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. |
Métodos
__enter__ ()
__exit__ ()
startEditing ({with_undo}, {multiuser_mode})
Parámetro | Explicación | Tipo de datos |
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. (El valor predeterminado es 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). (El valor predeterminado es True) | Boolean |
stopEditing (save_changes)
Parámetro | Explicación | Tipo de datos |
save_changes | Specifies whether to save or discard changes. (El valor predeterminado es True) | Boolean |
startOperation ()
stopOperation ()
abortOperation ()
undoOperation ()
redoOperation ()
Muestra de código
El siguiente código utiliza una sentencia with que inicia una operación de edición y utiliza la función CalculateField en un conjunto seleccionado de filas de una tabla. Todos los errores de herramientas que se produzcan se gestionarán e imprimirán.
Dado que la función CalculateField se realiza dentro de una sentencia with, si se produce alguna excepción, los cambios no se guardarán. Si CalculateField se completa correctamente, las actualizaciones se guardarán.
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')
A continuación, encontrará un ejemplo de cómo iniciar una sesión de edición y una operación de edición, crear una fila en una tabla y, luego, detener la operación de edición y confirmar la sesión de edición.
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)
A continuación, se ofrece un ejemplo de uso de la clase Editor como un administrador contextual con datos versionados.
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)