メインのデータベーステーブルexome_subが子テーブルになっていて、親テーブルexome_countからカラムを読み込んでいるときに、exome_countをDropしようとしたら
Cannot delete or update a parent row: a foreign key constraint fails
というエラーが出て消してくれない。
ON DELETE, ON UPDATEの設定を色々いじってみたが結局
Exome_sub.__table__.drop(engine) Exome_sub.__table__.create(engine)
という風にテーブルをDROPさせる方法ではどうにもならなかった。SQLWorkbenchで無理やり消して、createし直してみたが、これではリレーションの設定が復活しないらしく、どのみち駄目な模様。
ではどうするのかというと、テーブルをDROPするのではなくレコードをdeleteする方向ならいけることがわかった。その上で、deleteする順番をうまく調整してリレーションが壊れないようにしてやったところ、無事にちゃんと走るコードにたどり着いた。
まず子テーブルについて
Exome_sub_temp.__table__.drop(engine) Exome_sub_temp.__table__.create(engine) q = select(["exome_sub...... ..... ....."], from_obj=['exome_sub']) ins = insert(Exome_sub_temp).from_select((Exome_sub_temp...... ..... .....), q) conn = engine.connect() conn.execute(ins) session.query(Exome_sub).delete() session.commit()
これでテーブルを一旦tempに退避させてからdelete()で全件削除。そのあと親テーブルも同様にdeleteしたら、そこに必要なカラムをinsertしてテーブルを作り直す。その上で、子テーブルも書き戻してやる。
これで、テーブルのリレーションが壊れることなくDELETE, UPDATEが実施できた。
これにより、SQLite版をMySQL版に完全移植完了した。
実行速度は正直ほとんど変わらないようだ。MySQLだとMySQLWorkBenchのようなGUIインターフェースで直接アクセスすることが容易であると言うくらいの利点しかないかな。
SQLiteもバックアップが簡単だったり、いろいろ融通が効かせやすく、いいと思うんだけどね。
さてさて、このプロジェクトも終わりが見えてきたな。
同じ結果になるのに別のコードを使っていたりするところを統一して、引き継ぐ人が困らないようにするくらいかな。