2012-01-31 78 views
2

我正尝试使用loaddata命令加载本地postgres数据库和json转储的数据(来自在线数据库)。但是由于我已经在db中使用主键获得了一些数据,因此它失败并显示“完整性错误”。然后我尝试刷新数据库,以便在syncdb之后立即进入状态。但它给了我以下信息并失败。无法在Django中刷新Postgres数据库

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应该用于删除依赖于的表。我无法完全确定在dbshel​​l中使用它的确切语法。

我还访问的PostgreSQL壳作为sudo user并试图使用拖放

DROP DATABASE DBNAME 

命令数据库中。但数据库依然存在。

编辑:

由于stevejalim的评论我能够删除数据库,并创建一个新的。我再次运行syncdb命令并再次创建数据库。但是,试图加载使用loaddata命令分贝引发错误

IntegrityError: duplicate key value violates unique constraint 

任何帮助,在此,将不胜感激。

+2

听起来很愚蠢,但是在DB删除命令之后你有没有分号? 'DROP DATABASE DBNAME;' – 2012-01-31 15:25:44

+0

我的不好。我以为我一直在走错路。 – primpap 2012-01-31 15:40:49

+1

'truncate'不会删除任何表。它只会删除所有行。 – 2012-01-31 16:27:05

回答

6

您无法删除数据库的原因可能是您已连接到它。我必须猜测,因为你在回避实际的错误信息。从那里

psql postgres 

,并发起命令:连接到默认维护数据库postgres代替(如数据库的超级用户或所有者)

DROP DATABASE dbname; 

看看这个related question od dba.SE一个可靠的方法来删除不想去的数据库。


关于你得到新的错误:你有你的表中的一个定义的唯一或主索引或约束,但是尝试插入重复的值。在现代版本的PostgreSQL中,您可以在错误消息中获得更多信息。如:

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

引发了一个问题:您使用的是哪个版本的PostgreSQL?
在任何情况下:检查您的数据库日志文件的详细信息,并修复源中的重复值(或删除UNIQUE约束)。

3

您可以尝试使用postgres dropdb命令行工具删除数据库。

dropdb dbname