2012-01-31 10 views
2

loaddataコマンドを使用して、ローカルのpostgresデータベースにjsonのダンプデータ(オンラインdbから)をロードしようとしています。しかし、プライマリキーを持つデータベースには既にデータがあるため、 "Integrity Error"で失敗します。それから、syncdbの直後に状態を取得するようにデータベースをフラッシュしようとしました。しかし、それは私に次のメッセージを与え、失敗します。DjangoでPostgres DBをフラッシュできない

You have requested a flush of the database. 
This will IRREVERSIBLY DESTROY all data currently in the 'app' database, 
and return each table to the state it was in after syncdb. 
Are you sure you want to do this? 

    Type 'yes' to continue, or 'no' to cancel: yes 
Error: Database app couldn't be flushed. Possible reasons: 
    * The database isn't running or isn't configured correctly. 
    * At least one of the expected database tables doesn't exist. 
    * The SQL was invalid. 
Hint: Look at the output of 'django-admin.py sqlflush'. That's the SQL this command wasn't able to run. 
The full error: cannot truncate a table referenced in a foreign key constraint 
DETAIL: Table "taskapp_taskrequest" references "taskapp_task". 
HINT: Truncate table "taskapp_taskrequest" at the same time, or use TRUNCATE ... CASCADE. 

これは私が複数のモデルとその中の多くの外部キー関係を持つデータベースを持って

BEGIN; 
TRUNCATE "auth_permission", "auth_group", "tagging_taggeditem", "auth_user_user_permissions", "taskapp_task_reviewers", "taskapp_task", "django_site", "profile_profile", "django_content_type", "profile_notification", "django_session", "auth_user_groups", "taskapp_pyntrequest", "profile_rolerequest", "tagging_tag", "taskapp_textbook_chapters", "registration_registrationprofile", "taskapp_textbook", "django_admin_log", "auth_group_permissions", "taskapp_task_selected_users", "taskapp_taskcomment", "south_migrationhistory", "taskapp_task_claimed_users", "taskapp_taskclaim", "taskapp_workreport", "auth_message", "taskapp_reportcomment", "auth_user"; 
SELECT setval(pg_get_serial_sequence('"registration_registrationprofile"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"tagging_tag"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"tagging_taggeditem"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"south_migrationhistory"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"auth_permission"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"auth_group"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"auth_user"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"auth_message"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"django_content_type"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"django_site"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"django_admin_log"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"profile_profile"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"profile_notification"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"profile_rolerequest"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"taskapp_task"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"taskapp_taskcomment"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"taskapp_taskclaim"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"taskapp_workreport"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"taskapp_reportcomment"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"taskapp_pyntrequest"','id'), 1, false); 
SELECT setval(pg_get_serial_sequence('"taskapp_textbook"','id'), 1, false); 
COMMIT; 

sqlflushコマンドに対応する出力です。私がインターネット上で読んだことから、Truncateは依存するテーブルを削除するのに使われるべきだと私は理解しています。私はdbshel​​lでそれを使用するための正確な構文を理解できません。

Iはまたsudo userとしてPostgreSQLのシェルにアクセスし

DROP DATABASE DBNAME 

コマンドを使用してデータベースを削除しようとしました。しかし、データベースは存続します。

編集:私は、データベースを削除することができましたし、新しいものを作成しstevejalimさんのコメントに

感謝。私は再度syncdbコマンドを実行し、dbを再度作成しました。しかしloaddataのコマンドを使用してDBをロードしようとすると、

IntegrityError: duplicate key value violates unique constraint 

エラーがスローされます。この上の任意の助けもいただければ幸いです。

+2

音が愚かですが、そのDBドロップコマンドの後にセミコロンを付けましたか? 'DROP DATABASE DBNAME;' –

+0

私の悪いです。私はいつも間違った道を行くと思った。 – primpap

+1

'truncate'はテーブルを削除しません。すべての行だけが削除されます。 –

答えて

6

データベースを削除できなかった理由は、おそらくあなたがそのデータベースに接続していたためです。あなたは実際のエラーメッセージを控えているので、私は推測する必要があります。

psql postgres 

そして、そこからコマンドを起動します:(デシベルのスーパーユーザーまたは所有者として)代わりに、デフォルトの保守データベースpostgresに接続し

DROP DATABASE dbname; 

ドロップする堅牢な方法でこのrelated question od dba.SEをチェックデータベースは行きたくない。

あなたが得る新しいエラーに関する

:あなたのテーブルのいずれかに定義されているUNIQUEまたはPRIMARYインデックスまたは制約を持っていますが、重複する値を挿入しようとします。現代版のPostgreSQLでは、エラーメッセージに詳細な情報があります。 Like:

ERROR: duplicate key value violates unique constraint "tbl_pkey" 
DETAIL: Key (tbl_id)=(10) already exists. 

PostgreSQLのどのバージョンを使用しますか?
いずれの場合も:データベースログファイルでその詳細を確認し、ソースに重複した値を修正する(またはUNIQUE制約を削除する)。

3

postgres dropdbコマンドラインツールを使用してデータベースを削除できます。

dropdb dbname 
関連する問題