インポートデータのワークフロー¶
このドキュメントでは、インポートプロセスのカスタマイズを可能にするフックで、インポートデータのワークフローを詳しく説明します。インポートプロセスの中心的な側面は、下記の説明にあるリソースの import_data()
メソッドです。
-
import_data
(dataset, dry_run=False, raise_errors=False)¶ Resource
のimport_data()
メソッドは、指定されたデータセットからデータをインポートすることを担当します。dataset
は必須であり、ヘッダー行を持つtablib.Dataset
であることが必要です。dry_run
はデータベースを変更するか、インポートをシュミレートするかどうかを判断するブール値です。デフォルトはFalse
です。raise_errors
はブール値です。True
の場合、エラーが発生します。デフォルトはFalse
です。これは最終的なエラーとトレースバックがResult
インスタンスに保存されることを意味します。
これはメソッドが呼び出されたときに起こることです:
最初に、インポート中に収集されたエラーやその他の情報を保持する新しい
InstanceLoader
インスタンが初期化されます。次に、既存のインスタンスのロードを担当する
InstanceLoader
が初期化されます。ResourceOptions
のinstance_loader_class
属性を使用して別の :class:~import_export.instance_loaders.BaseInstanceLoader` を指定できます。CachedInstanceLoader
を使用すると、データベースクエリの数を減らすことが出来ます。利用可能な実装については、 source を参照して下さい。before_import()
フックが呼び出されます。このメソッドをリソースに実装することで、インポートプロセスをカスタマイズ出来ます。インポート大勝のデータセットの各行は、次の手順に従って処理されます:
before_import_row()
フックはインポートする前に変更される行データを許可するために呼び出されますget_or_init_instance()
は、現在のBaseInstanceLoader
とデータセットの現在の行で呼び出され、オブジェクトが返され、オブフェクトが新しく作成されたかどうかのブール値が宣言されます。現在の行でオブジェクトが見つからない場合は、オブジェクトを初期化するために
init_instance()
が呼び出されます。いつものように、
init_instance()
実装を上書きして、新しいオブジェクトの作成方法をカスタマイズすることが出来ます(つまり、デフォルト値の設定)。for_delete()
は渡されたinstance
を削除するかどうかを判断するために呼び出されます。この場合、現在の行のインポートプロセスはこの時点で停止します。前の手順でインスタンスが削除されなかった場合、
import_obj()
は現在のオブジェクトとしてinstance
を、現在の行としてrow
を、そしてdry run
で呼ばれます。import_field()
は、多対多のフィールドをスキップするResource
の各フィールドに対して呼び出されます。多対多のフィールドはインスタンスに主キーを持たせる必要があるためスキップされます。そしてオブジェクトがすでに保存されている時に代入が延期されます。attribute`()
が設定され、Field.column_name` が指定された行に存在する場合、save()
を呼び出します。次いで、新たにインポートされたオブジェクトがすでに存在するオブジェクトと異なるか否か、したがって、与えられた行がスキップされるべきか否かが判定される。これは、元のオブジェクトとして
original
を使用し、データセットから現行オブジェクトとしてinstance
をskip_row()
を呼び出すことによって処理されます。現在の行をスキップする場合、
row_result.import_type
はIMPORT_TYPE_SKIP
に設定されます。現在の行をスキップしない場合は、
save_instance()
が呼び出され、 dry_run` が設定されていない場合、実際にインスタンスが保存されます。インポートプロセスをカスタマイズするオプションを提供する2つのフックメソッド(デフォルトでは何もしません)があります:
どちらのメソッドも、
instance
引数とdry_run
引数を受け取ります。save_m2m()
は、多くのフィールドを保存するために呼び出されます。RowResult
には、元のフィールドとインポートされたオブジェクトフィールドの間のdiff、および行が新規か更新済みかスキップされたか削除されたかを示すimport_type
属性が割り当てられます。行の処理中に例外が発生し、
raise_errors=False
(デフォルト)のimport_data()
が呼び出された場合、特定のトレースバックがRowResult
にも追加されます。行がスキップされなかった場合、またはスキップされた行をレポートするように
Resource
が構成されている場合は、RowResult
がResult
追加されますafter_import_row()
フックは呼び出されます
Result
が返されます。
トランザクションサポート¶
トランザクションサポートが有効な場合、インポートプロセス全体がトランザクション内でラップされ、ロールバックまたはコミットされます。 import_data
(create / delete / update)の内部から呼び出されたすべてのメソッドは、dry_run
引数に対して False
を受け取ります。