Resumen
La clase del Editor permite utilizar operaciones y sesiones de edición para administrar transacciones de base de datos.
Las ediciones son temporales hasta que se guardan y se aplican permanentemente a los datos. También puede finalizar una sesión de edición sin guardar los cambios.
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, es posible deshacer la transacción.
- Pilas opcionales de acciones para deshacer y rehacer de la operación de edición mantenidas por la geodatabase. Tras detener una operación de edición, se coloca en la pila de acciones para deshacer. La pila de acciones para deshacer/rehacer se pueden atravesar llamando 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.
La clase Editor se puede utilizar para iniciar y detener operaciones y sesiones de edición para shapefiles y geodatabases de archivos, personales y corporativas. La clase Editor se puede utilizar para iniciar una sesión de edición con datasets versionados o no versionados.
Antes de iniciar una sesión de edición, asegúrese de que se hayan abierto todos los datasets que se van a editar.
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, haga una llamada a stopOperation. Para cancelar una operación de edición, haga una llamada a abortOperation. Para completar una sesión de edición, haga una llamada a stopEditing, que acepta un parámetro booleano que indica si los cambios realizados en la sesión se deben confimar o descartar.
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 operaciones y sesiones de edición tambien se pueden utilizar con sentencias with de Python. Las sentencias with actúan como administradores contextuales y administran las llamadas adecuadas de inicio, detención y anulación por usted. El siguiente ejemplo destaca la estructura básica de la clase Editor que se utiliza 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 acciones para deshacer y rehacer
Las pilas de acciones para 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 va a contener varias operaciones con el potencial de deshacerse (y rehacerse), las pilas de acciones para deshacer y rehacer deben habilitarse. 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.
Los dos métodos que controlan las pilas de acciones para deshacer y rehacer son undoOperation y redoOperation. El método undoOperation revierte 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 acciones para rehacer. El método redoOperation mueve una operación de edición de la parte superior de la pila de acciones para rehacer a la pila de acciones para deshacer y convierte el estado de la sesión de edición al que era antes 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 sesiones 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 crear una instancia y presentar un nuevo cursor para cada operación. Es de gran importancia al editar filas devueltas por un cursor, porque las filas están vinculadas a un estado concreto de la geodatabase. Evite utilizar un cursor en varias operaciones de edición. Si lo hace, podría provocar un comportamiento inesperado y pérdida de datos.
Sintaxis
Editor (workspace)
Parámetro | Explicación | Tipo de datos |
workspace | Path to the workspace to edit. Editor can edit only one workspace at a time. | String |
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
Ejemplo 1 de Editor
El siguiente código utiliza una sentencia with que inicia una operación de edición y realiza CalculateField en un conjunto seleccionado de filas en una tabla. Todos los errores de herramientas que se produzcan se gestionarán e imprimirán.Puesto que 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, se guardarán las actualizaciones.
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))
Ejemplo 2 de Editor
A continuación, se muestra un ejemplo de un inicio de una sesión de edición y una operación de edición, donde se crea una fila en una tabla, se detiene la operación de edición y se confirma la sesión de edición.
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)