PostgreSQL のデータベースを MySQL (MariaDB) に変換する

Published: 2021-07-25 10:40 +0900 by Chirimen

PostgreSQL のデータベースを MySQL (MariaDB) 用に変換しようとした。 変換ツールみたいなのが用意されているのかと思ったのだが、そうでもないみたい。 仕方がないので自力でなんとかした。

方針

PostgreSQL のデータベースをダンプすると SQL が列挙されたテキストが出力されるので、 これを MySQL 用に修正して、 MySQL (MariaDB) に入力として与えればよい。

文章で書くと単純だ。 ちょっと量が多いのが問題かな。

PostgreSQL データベースのダンプ

ダンプには pg_dump を使う。 バックアップなら pg_dumpall の方を使うことが多いかもしれないけど、 移行はデータベース単位で作業したほうが楽だと思う。

事実上、オプション --column-inserts の指定は必須。 pg_dump はデフォルトで COPY コマンドを生成するが MySQL では使えない。 --column-inserts を指定すると INSERT コマンドを使うようになる。

ダンプされたファイルの修正

ダンプファイルは SQL のテキストなので基本的にはインポート可能だけれど、 PostgreSQL 固有の設定とか、 非互換な表現とかあるので事前に編集してく必要がある。

SET 文はすべて削除する。 というより、テーブル定義とデータ定義以外はすべて削除して構わない。 気になるようなら中身を確認して PostgreSQL と同等の機能が MySQL MariaDB で提供されていないか確認するくらい。

SQL の非互換な表現部分は、 型とか制約とかそのあたりに多めな印象だっかけど、 あまり深く考えずに、try & error で何度も修正しながらインポートした。

制約の機能を有効にするには MySQL 側のデータベースエンジンを InnoDB にしておく必要がある。 当初のデフォルトが MyISAM になってて、 制約の設定はエラーなく通ったけど制約チェックがされていない状態になってしまっていた。

Share

Latest Posts

Django Rest Framework のテストでハマったこと (4)

Django で既存データベースから inspectdb で作成した models.my は managed = False となっている。 そのままだと test を実行したときに、 テスト用データベースにモデルに対応したテーブルが作成されない。

Django Rest Framework のテストでハマったこと (3)

factory_boy の Faker() で、 取得した値を加工してから使用する話。

Django Rest Framework のテストでハマったこと (2)

Django のテスト用データを作成するのによく用いられる factory_boy で locale を指定して日本語圏用のデータを利用する話。