1. ホーム
  2. database

[解決済み] SQLITE SQLダンプファイルをPOSTGRESQLに変換する

2022-05-18 02:33:39

質問

私は、POSTGRESQLで本番環境とSQLITEデータベースを使用して開発をしてきました。 ローカル データベースを膨大な量のデータで更新したばかりで、特定のテーブルを本番用データベースに転送する必要があります。

実行に基づくと sqlite database .dump > /the/path/to/sqlite-dumpfile.sql を実行すると、SQLITEは以下のフォーマットでテーブルダンプを出力します。

BEGIN TRANSACTION;
CREATE TABLE "courses_school" ("id" integer PRIMARY KEY, "department_count" integer NOT NULL DEFAULT 0, "the_id" integer UNIQUE, "school_name" varchar(150), "slug" varchar(50));
INSERT INTO "courses_school" VALUES(1,168,213,'TEST Name A',NULL);
INSERT INTO "courses_school" VALUES(2,0,656,'TEST Name B',NULL);
....
COMMIT;

上記を本番サーバーにインポートできるPOSTGRESQL互換のダンプファイルに変換するにはどうすればよいですか?

どのように解決するのですか?

そのダンプファイルをそのまま psql :

/path/to/psql -d database -U username -W < /the/path/to/sqlite-dumpfile.sql

もし id 列を "auto increment" にしたい場合、テーブル作成行でその型を "int" から "serial" に変更します。そうすると、PostgreSQLはその列にシーケンスを付加し、NULL IDでのINSERTが自動的に次の利用可能な値を割り当てるようにします。また、PostgreSQLは AUTOINCREMENT コマンドを認識しませんので、これらを削除する必要があります。

また datetime カラムをチェックし、SQLite スキーマの timestamp に変更してください。(感謝 クレイ に感謝します)。

もし SQLite にブーリアン演算があれば 10 から 1::boolean であり 0::boolean (それぞれ) またはダンプのスキーマセクションでbooleanカラムを整数に変更し、インポート後にPostgreSQL内で手作業でそれらを修正することができます。

SQLiteにBLOBがある場合、スキーマで bytea . おそらく、いくつかの decode の呼び出しも必要でしょう。 . たくさんのBLOBを扱う場合は、SQLを混乱させるよりも、好きな言語でクイック&ダーティなコピー機を書く方が簡単かもしれません。

通常、外部キーがある場合、おそらく set constraints all deferred を参照して、挿入順序の問題を避けるために、コマンドをBEGIN/COMMITペアの内部に配置します。

おかげさまで Nicolas Riley に感謝します。

もし、あなたが ` がある場合、それらを削除する必要があります。

PostGRESQLもまた unsigned 列を認識しないので、これを削除するか、このようなカスタムメイドの制約を追加するとよいでしょう。

CREATE TABLE tablename (
    ...
    unsigned_column_name integer CHECK (unsigned_column_name > 0)
);

SQLite はデフォルトで null 値を '' であるのに対して、PostgreSQLはそれらを NULL .

SQLiteダンプファイルの構文はPostgreSQLとほぼ互換性があるように見えますので、いくつかのパッチを適用して psql . SQLのINSERTを通して大きなデータの山をインポートするのは時間がかかるかもしれませんが、うまくいくでしょう。