P129 DBのスキーママイグレーションとデータマイグレーションを分ける

DjangoのORMはマイグレーションの機能も提供している。
Django ORMのモデルに定義したフィールドの移動は、実際にはフィールドの削除と新規追加として扱われる。
このような変更に対するマイグレーションファイルは、1つのマイグレーションでカラムの追加と削除を行う。
そのファイル内にデータ移動の処理も加えたいとする。
(1つのDjangoマイグレーションファイルにスキーマ変更とデータ変更の両方を実装するのはよく見かける)
結果、カラム追加、データ移動、カラム削除を同時に行う1つのマイグレーションファイルが出来上がる。
当ファイルは基本的には問題ないが、エラーが発生した場合、Django ORM側ではどうにもできなくなる。
この問題は、MySQLOracleDDL実行するとトランザクションが完了してしまうためである。
対応方法としては、上記の例であれば、3つのファイルに分けるべきである。
また、データマイグレーションロールバック処理も実装するべきである。