1

私はDjangoアプリを持っています。このアプリのデータベースは、手動で開発されています(これは言語学習アプリであるため、語彙や文法の概念などが格納されています)。私は地元のdjango/postgres環境でその開発をしたいと思っています。

ただし、ライブバージョンからUserテーブルを絶えず消去したくありません。

私はPostgresを初めて使用するので、ここで何をしているのかを知っていると思い込まないでください。ある種のスキーマがここでの正しいアプローチでしょうか?

4

1 に答える 1

1

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

于 2012-10-27T11:07:37.780 に答える