MySQL から PostgreSQL にデータベースを移植しようとしています。Postgres でスキーマを再構築したので、テーブルを再作成せずにデータを取得するだけで済みます。
すべてのレコードを反復処理して一度に 1 つずつ挿入するコードを使用してこれを行うこともできますが、それを試してみたところ、データベースのサイズが遅くなるため、代わりに mysqldump と psql へのパイプを使用しようとしています (1 回につき 1 回)。動作するようになったら並列化する可能性があります)。
ここまでたどり着くには、さまざまなフープを飛び越えて、さまざまなフラグをオンまたはオフにして、漠然と正気なダンプを取得する必要がありました。繰り返しますが、データを取得するための空のスキーマを既に準備しているため、これは INSERT INTO のみをダンプします。
/usr/bin/env \
PGPASSWORD=mypassword \
mysqldump \
-h mysql-server \
-u mysql-username \
--password=mysql-password \
mysql-database-name \
table-name \
--compatible=postgresql \
--compact \
-e -c -t \
--default-character-set=utf8 \
| sed "s/\\\\\\'/\\'\\'/g" \
| psql \
-h postgresql-server \
--username=postgresql-username \
postgresql-database-name
sed
その醜いコマンド以外はすべて管理可能です。sed
MySQL のアプローチを、文字列内の単一引用符を引用する ( 'O\'Connor'
) o PostgreSQL の引用要件 ( ) に変換しようと試みています'O''Connor'
。ダンプに次のような文字列が含まれるまでは機能します: ... はい、この形式のユーザー入力がデータベースにあるようです。これは完全に有効ですが、コマンド'String ending with a backslash \\'
を渡しません。sed
コマンドに後読みを追加することもできますがsed
、うさぎの穴に這い入っているような気がします。次のいずれかの方法はありますか:
a) 一重引用符を二重にして引用するように mysqldump に指示します b) バックスラッシュが引用エスケープとして解釈されることを期待するように psql に指示しますか?
との違いには別の問題がBINARY
ありbytea
ますが、base64 エンコーディング/デコーディング フェーズでそれを回避しました。
編集 | (b) を で実行できるように見えますがset backslash_quote = on; set standard_conforming_strings = off;
、それをパイプ出力の先頭に挿入する方法がわかりません。