kuroの覚え書き

96の個人的覚え書き

MySQLへの移植2

メインのデータベーステーブル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もバックアップが簡単だったり、いろいろ融通が効かせやすく、いいと思うんだけどね。

さてさて、このプロジェクトも終わりが見えてきたな。

同じ結果になるのに別のコードを使っていたりするところを統一して、引き継ぐ人が困らないようにするくらいかな。