インポートデータのワークフロー¶
このドキュメントでは、インポートプロセスのカスタマイズを可能にするフックで、インポートデータのワークフローを詳しく説明します。インポートプロセスの中心的な側面は、下記の説明にあるリソースの 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 を受け取ります。