Не удается очистить базу данных Postgres в Django - PullRequest
3 голосов
/ 31 января 2012

Я пытаюсь загрузить локальную базу данных postgres с дампированными данными json (из онлайн-базы данных) с помощью команды loaddata. Но это не с «Ошибка целостности», поскольку у меня уже были некоторые данные в БД с первичным ключом. Затем я попытался очистить базу данных, чтобы привести ее в состояние сразу после syncdb. Но он выдает мне следующее сообщение и терпит неудачу.

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.

Я также получил доступ к оболочке postgresql как пользователь sudo и попытался удалить базу данных, используя

DROP DATABASE DBNAME

команда. Но база данных сохраняется.

Edit:

Благодаря комментарию stevejalim я смог удалить базу данных и создал новую. Я снова запустил команду syncdb и снова создал базу данных. Но попытка загрузить базу данных с помощью команды loaddata выдает ошибку

IntegrityError: duplicate key value violates unique constraint

Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 2 ]

6 голосов
/ 01 февраля 2012

Причина, по которой вы не можете удалить базу данных, возможно, заключается в том, что вы подключены к ней.Я должен догадаться, потому что вы сдерживаете фактическое сообщение об ошибке.Вместо этого подключитесь к базе данных обслуживания по умолчанию postgres (как суперпользователь или владелец БД):

psql postgres

и запустите команду оттуда:

DROP DATABASE dbname;

Проверьте это связанный вопрос od dba.SE для надежного способа удаления базы данных, которая не хочет идти.


По поводу новой ошибки, которую вы получаете: у вас есть УНИКАЛЬНЫЙ или ПЕРВИЧНЫЙ индекс илиограничение определено в одной из ваших таблиц, но попробуйте вставить повторяющиеся значения.В современных версиях PostgreSQL вы получите больше информации в сообщении об ошибке.Например:

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

Возникает вопрос: какую версию PostgreSQL вы используете?
В любом случае: проверьте файл журнала вашей базы данных на эти детали и исправьте дублирующиеся значения в вашем источнике (или удалитеУНИКАЛЬНОЕ ограничение).

4 голосов
/ 31 января 2012

Вы можете попробовать удалить базу данных с помощью инструмента командной строки postgres dropdb.

dropdb dbname
...