Editor

概要

Editor クラスを使用すると、編集セッションおよび操作によってデータベース トランザクションを管理できます。

編集内容は、保存してデータに永続的に適用するまでは一時的です。 変更を保存せずに編集セッションを終了することもできます。

ディスカッション

編集セッションおよび操作には、次の利点があります。

  • 編集をアトミック トランザクションにグループ化できます。 すべての編集が完了する前にエラーが発生した場合、トランザクションをロール バックできます。
  • オプションの編集操作である元に戻す/やり直しスタックが、ジオデータベースによって保守されます。 編集操作を終了すると、元に戻すスタックに配置されます。 元に戻す/やり直しスタックは、undoOperation および redoOperation メソッドを呼び出すことでトラバースできます。
  • 編集セッションと編集操作では、一括更新を実行できます。これにより、エンタープライズ ジオデータベースの編集時に、パフォーマンス上の大きなメリットを得ることができます。
  • 複数のユーザーによる同時編集を許可しているジオデータベースでは、編集セッション内のアプリケーションは、セッションが完了するまで、他のアプリケーションが行った変更を認識しません。

Editor クラスを使用して、ファイル ジオデータベース、パーソナル ジオデータベース、エンタープライズ ジオデータベースおよびシェープファイルの編集セッションと編集操作を開始および終了できます。 Editor クラスを使用して、バージョン対応データセットまたはバージョン非対応データセットを使用した編集セッションを開始できます。

編集セッションを開始する前に、編集するすべてのデータセットを開いていることを確認します。

startEditing メソッドは、編集セッションを開始するために使用されます。startOperation メソッドは、編集操作を開始するために使用されます。 編集操作をコミットするには、stopOperation を呼び出します。 編集操作をキャンセルするには、abortOperation を呼び出します。 編集セッションを完了するには、stopEditing を呼び出します。これは、セッションに対する変更をコミットするか破棄するかを示すブール パラメーターを設定します。

メモ:

このパターンから逸脱すると、予期しない結果になる可能性があります。 たとえば、編集操作の実行中は、stopEditing を呼び出さないでください。 代わりに、編集操作を中止して編集セッションを終了します。

編集操作は 1 つの編集セッションのコンテキスト内で制御する必要があります。編集操作を他の編集操作内でネストさせることはできません。

編集セッションと with ステートメント

編集セッションおよび操作は、Python の with ステートメントでも使用できます。 with ステートメントはコンテキスト マネージャーとして機能し、適切な開始、終了、中止の呼び出しを処理します。 次の例は、with で使用される Editor クラスの基本構造を示したものです。

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

元に戻す/やり直しスタックの使用

編集セッションの元に戻す/やり直しスタックは、startEditing メソッドのブール パラメーターに応じて有効化/無効化されます。 編集セッションに複数の操作が含まれ、条件付きでロール バック (およびやり直し) される可能性がある場合、元に戻す/やり直しスタックを有効化する必要があります。 それ以外の場合 (編集セッションに 1 つの操作しか含まれない場合など)、このパラメーターを False に設定して、元に戻す/やり直しスタックを無効化すると、パフォーマンスを向上させることができます。

メモ:

エンタープライズ ジオデータベースでバージョン対応の編集セッションを開始する場合、元に戻す/やり直しスタックは常に有効になります。 バージョン非対応の編集セッションは、元に戻す/やり直し操作をサポートしていません。

元に戻す/やり直しスタックを制御する 2 つのメソッドは undoOperationredoOperation です。 undoOperation は、編集セッションの状態を最後の編集操作の時点にロール バックし、編集操作をやり直しスタックに移動します。 redoOperation メソッドは、編集操作をやり直しスタックの一番上から元に戻すスタックに移動し、編集セッションの状態を編集操作の実行後の時点にします。 編集操作をコミットすると、やり直しスタックが消去され、やり直しスタック上にあった操作をやり直すことができなくなります。

編集セッションが必要な状況

編集セッション内でのみ編集できるデータセット タイプの一部を次に示します。

  • トポロジに属しているフィーチャクラス
  • ジオメトリック ネットワークに属しているフィーチャクラス
  • ネットワーク データセットに属しているフィーチャクラス
  • エンタープライズ ジオデータベース内のバージョン対応データセット
  • クラス エクステンションを持つ一部のオブジェクトとフィーチャクラス

編集セッションとカーソル

カーソルの範囲は、1 つの編集操作に限定する必要があります。 つまり、操作ごとに新しいカーソルをインスタンス化および解放する必要があります。 これは、カーソルによって返される行を編集しているとき、行はジオデータベースの特定の状態と関連付けられているため、非常に重要です。 複数の編集操作に 1 つのカーソルを使用しないようにしてください。 使用すると、予期しない動作やデータの損失を招く可能性があります。

構文

Editor (workspace)
パラメーター説明データ タイプ
workspace

Path to the workspace to edit. Editor can edit only one workspace at a time.

String

プロパティ

プロパティ説明データ タイプ
isEditing
(読み取り専用)

True if the Editor is in an edit session.

Boolean

手法の概要

手法説明
__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.

手法

__enter__ ()
__exit__ ()
startEditing ({with_undo}, {multiuser_mode})
パラメーター説明データ タイプ
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 ArcSDE, the undo and redo stacks will always be enabled. Nonversioned edit sessions do not support undo and redo operations.

(デフォルト値は次のとおりです 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).

(デフォルト値は次のとおりです True)

Boolean
stopEditing (save_changes)
パラメーター説明データ タイプ
save_changes

True to save changes; False to discard changes.

(デフォルト値は次のとおりです True)

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

コードのサンプル

Editor の例 1

次のコードは、with ステートメントを使用して、編集操作を開始し、テーブル内の行の選択セットに CalculateField を実行します。 発生するツール エラーは、処理および印刷されます。

CalculateFieldwith ステートメント内で実行されるため、例外が発生した場合、変更内容は保存されません。 CalculateField が正常に完了した場合、更新内容が保存されます。

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 の例 2

次に、編集セッションと編集操作を開始し、テーブル内に行を作成してから編集セッションを終了して、編集セッションをコミットする例を示します。

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)

関連トピック