2012-01-31 3 views
2

loaddata 명령을 사용하여 json 덤프 된 데이터 (온라인 db에서)로 로컬 postgres 데이터베이스를로드하려고합니다. 하지만 기본 키가있는 DB에 이미 일부 데이터가 있으므로 "무결성 오류"와 함께 실패합니다. 그런 다음 데이터베이스를 플러시하여 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. 

이것은 내가 여러 모델과 그들 가운데 많은 외래 키 관계와 데이터베이스가 sqlflush 명령

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; 

에 해당하는 출력됩니다. 인터넷을 통해 읽은 것으로부터, Truncate가 의존하는 테이블을 삭제해야한다는 것을 이해합니다. 나는 그것을 dbshell에서 사용하기위한 정확한 구문을 이해할 수 없다.

나는 또한 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 

그리고 시작 : (DB를의 수퍼 유저 또는 소유자로) 대신 기본 유지 관리 데이터베이스 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 
관련 문제