memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

個人メモ:postgresqlでpg_dumpしてsqlite3でreadするまでのログ

以下の続きです。

render.comのpostgresqlのテーブルのバックアップを取る(M1 mac) - memorandums

とりあえずpg_dumpなるものを使ってバックアップはとれたものの、開発系ではsqlite3を使いたいのでインポートできないかな。。。と。ちょっとやってみたログです。

まず、pg_dumpするときに、上記の記事での方法で実行するとCOPYコマンドなるものでダンプされるので他のデータベースに持っていったらSQLとして実行できない可能性があります(たぶんposgresql固有のコマンドでは?)。で、pg_dumpするときに--insertsとオプションをつけるとCOPYではなくINSERTコマンドでデータ追加するようにダンプされました。

PGPASSWORD=<YOUR_DB_PASS> pg_dump \ -h postgres.render.com \ -U <YOUR_DB_USER> \ --format=custom --no-acl --no-owner --inserts \ <YOUR_DB_NAME> > <YOUR_DUMP_NAME>.dump

で、これでダンプしたファイルをテキストエディタで開き、postgresql固有のSQLを取り除きます。

先頭のSET、そしてCREATE TABLE文すべて(Railsであればrails db:migrateしたあとでインポートすればいいので)、あとダンプファイルの最後尾にALTER TABLE等があり、これらもエラーになるので削除します。ここまで編集したダンプファイルをsqlite3で.readすると。。。ちゃんとインポート?できました。

ただ。。。今回、読み込んだテーブルにはバイナリデータがありました。これがうまく読み込めない。postgresqlでバイナリデータをてテキストでダンプするときbase64?で文字列化している様子。sqlite3でreadしたらそのままbase64の文字列として表示されていた。でも、sqlite3でbinaryと指定したデータはエンコーディングする前のバイナリデータで保存されていた。だから、うまく表示されなかった様子だった。

この辺の仕組みをあれこれした経験がないので、とりあえず表示するときにbase64でdecodeしてみたけどうまく行かず。。。とりあえず今日の試行はここで終了。とりあえずローカルのpostgresqlに読み込ませてバイナリデータも正しく表示されることはわかっているので、これで研究は進められそう。

モヤモヤが残るけど、ちょっと調べた限りでは対処方法がわからなかった。。。しかたがない。時間は有限。