SQLite3 で適当に運用していた Rails アプリのデータを PostgreSQL に引っ越し
したのでメモ。
まず SQLite3 からデータを dump します。rails db とかで SQLite3 のインタラクティブシェルを起動してファイルに dump します。
sqlite> .output dump.sql sqlite> .dump sqlite> .q
この dump.sql をそのまま psql で突っ込むことができれば楽なんですが、SQLite3 と PostgreSQL には共有されていない方言がいくつかあるので、そのままで通りません。
今回やったところだと以下を一括置換して対応。たぶん他にもあると思います。注意点としては insert 文が含む文字列データの中に以下にマッチする文字列が含まれる場合もあるかと思うので、実行前に差分チェクは必要ですね。
:%s/INTEGER PRIMARY KEY AUTOINCREMENT/SERIAL PRIMARY KEY/g :%s/datetime/timestamp/g :%s/PRAGMA foreign_keys=OFF;/--PRAGMA foreign_keys=OFF;/g :%s/DELETE FROM sqlite_sequence;/--DELETE FROM sqlite_sequence;/g :%s/INSERT INTO "sqlite_sequence"/--INSERT INTO "sqlite_sequence"/g
こんな感じで実行。
psql -d dbname -U username -h hostname -W dump.sql
・・と思ったけど serial で作られる xxx_id_seq の nextval を今ある id の最大値より大きくしないとダメでした。うまくやりようはありそうだけど、テーブル数少なかったので手動でやりました。
select setval('xxx_id_seq', 10000);