Editor

サマリー

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

編集はステージングされ、トリガーされるまではデータにコミットされません。 これにより、1 つの編集操作または複数の編集操作にまたがってエラーが発生した場合に、より適切な制御が可能になります。

説明

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

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

Editor クラスを使用して、ジオデータベースおよびシェープファイルの編集セッションと編集操作を個別に開始および終了できます。

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

注意:

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

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

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

編集セッションおよび操作は、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 つのカーソルを使用しないようにしてください。 使用すると、予期しない動作やデータの損失を招く可能性があります。

編集セッションとバージョン対応データ

エンタープライズ ジオデータベースのテーブルとフィーチャクラスをバージョン対応登録することができます。 isVersioned プロパティを使用して、テーブルまたはフィーチャクラスをバージョン対応登録するかどうかを指定できます。

エンタープライズ ジオデータベースのテーブルとフィーチャクラスを編集する場合、編集するデータのタイプに応じて編集セッションのモードを設定する必要があります。

  • バージョン非対応のテーブルまたはフィーチャクラスを編集する場合、引数 multiuser_mode を False に設定します。
  • バージョン対応のテーブルまたはフィーチャクラスを編集する場合、引数 multiuser_mode を True に設定します。

multiuser_mode を設定するには、Editor クラスまたは Editor クラスの startEditing メソッドを使用します。

multiuser_mode が正しく設定されていない場合、このクラスのオブジェクトを編集セッション外で更新できないことを通知するエラーが表示されます。

構文

 Editor (workspace, {multiuser_mode})
パラメーター説明データ タイプ
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.

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

Boolean

プロパティ

プロパティ説明データ タイプ
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 enterprise geodatabase, 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

Specifies whether to save or discard changes.

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

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

コードのサンプル

Editor の例 1

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

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

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')
Editor の例 2

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

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)
Editor の例 3

バージョン対応登録されたデータでコンテキスト マネージャーとして Editor クラスを使用する例を次に示します。

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)

関連トピック