私はDjangoアプリを持っています。このアプリのデータベースは、手動で開発されています(これは言語学習アプリであるため、語彙や文法の概念などが格納されています)。私は地元のdjango/postgres環境でその開発をしたいと思っています。
ただし、ライブバージョンからUserテーブルを絶えず消去したくありません。
私はPostgresを初めて使用するので、ここで何をしているのかを知っていると思い込まないでください。ある種のスキーマがここでの正しいアプローチでしょうか?
私はDjangoアプリを持っています。このアプリのデータベースは、手動で開発されています(これは言語学習アプリであるため、語彙や文法の概念などが格納されています)。私は地元のdjango/postgres環境でその開発をしたいと思っています。
ただし、ライブバージョンからUserテーブルを絶えず消去したくありません。
私はPostgresを初めて使用するので、ここで何をしているのかを知っていると思い込まないでください。ある種のスキーマがここでの正しいアプローチでしょうか?
1つのテーブルをバックアップするCOPY
には、データベース内から次を使用します。
COPY user_tbl TO '/path/to/file';
またはpg_dump
シェルから:
pg_dump -t user_tbl mydb > user_tbl.sql
次に、データベースを削除し、新しいバージョンを復元し、空にして、1つのテーブルを復元するためにuser_tbl
使用します。COPY FROM
COPY user_tbl FROM '/path/to/file';
または、シェルから1つのテーブルを使用してバックアップを復元しますpsql
。
psql -f user_tbl.sql mydb
「COPY...CASCADE」というものはありません。依存するテーブルを識別する最も簡単な方法は、トランザクションを開始し、呼び出しTRUNCATE tbl CASCADE
て、受け取った通知を記録することです。
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
次に、トランザクションをロールバックします。実際には何も変更されません。
ROLLBACK;
それに注意してください。COMMIT
切り捨てが行われる場合。
まあ、実際には「遅い」わけではありませんが、コードははるかに複雑です。ただし、これは関連するテーブルを排他的にロックするわけではないため、はるかにクリーンで安全です。
WITH RECURSIVE x AS (
SELECT conrelid::regclass
FROM pg_constraint
WHERE confrelid = 'user_tbl'::regclass
UNION
SELECT p.conrelid::regclass
FROM x
JOIN pg_constraint p ON p.confrelid = x.conrelid
)
SELECT conrelid::text AS tbl
FROM x;
戻り値:
tbl
------
tbl1
tbl2
tbl3
カタログテーブルで再帰CTE(PostgreSQL 8.4以降が必要)を使用しますpg_constraint
。これは、各テーブルが順番に依存関係を持つ可能性があるためです。
を使用して、直接または間接的に複数の外部キーにリンクされている可能性のあるテーブルの複数の評価を回避しUNION
ないでください。UNION ALL