Django在删除/创建数据库后无法同步数据库。

4

我想重置一个数据库,于是在通过psycopg2访问的postgresql服务器上执行了drop database和create database命令,这个服务器是由Django应用程序管理的。

当我执行./manage.py syncdb时,出现以下错误:

(prod)root@ns204612:/home/someproject/prod/django-mingus/mingus# ./manage.py syncdb
Traceback (most recent call last):
  File "./manage.py", line 16, in <module>
    execute_manager(settings)
  File "/home/someproject/prod/lib/python2.6/site-packages/django/core/management/__init__.py", line 362, in execute_manager
    utility.execute()
  File "/home/someproject/prod/lib/python2.6/site-packages/django/core/management/__init__.py", line 303, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/someproject/prod/lib/python2.6/site-packages/django/core/management/base.py", line 195, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/someproject/prod/lib/python2.6/site-packages/django/core/management/base.py", line 222, in execute
    output = self.handle(*args, **options)
  File "/home/someproject/prod/lib/python2.6/site-packages/django/core/management/base.py", line 351, in handle
    return self.handle_noargs(**options)
  File "/home/someproject/prod/lib/python2.6/site-packages/django/core/management/commands/syncdb.py", line 52, in handle_noargs
    tables = connection.introspection.table_names()
  File "/home/someproject/prod/lib/python2.6/site-packages/django/db/backends/__init__.py", line 491, in table_names
    return self.get_table_list(cursor)
  File "/home/someproject/prod/lib/python2.6/site-packages/django/db/backends/postgresql/introspection.py", line 30, in get_table_list
    AND pg_catalog.pg_table_is_visible(c.oid)""")
  File "/home/someproject/prod/lib/python2.6/site-packages/django/db/backends/util.py", line 19, in execute
    return self.cursor.execute(sql, params)
psycopg2.InternalError: current transaction is aborted, commands ignored until end of transaction block

在postgresql日志中,我得到了以下错误:

2010-01-24 01:08:02 CET ERROR:  relation "django_site" does not exist
2010-01-24 01:08:02 CET STATEMENT:  SELECT "django_site"."id", "django_site"."domain", "django_site"."name" FROM "django_site" WHERE "django_site"."id" = 1  ORDER BY "django_site"."domain" ASC
2010-01-24 01:08:02 CET ERROR:  current transaction is aborted, commands ignored until end of transaction block
2010-01-24 01:08:02 CET STATEMENT:  
                    SELECT c.relname
                    FROM pg_catalog.pg_class c
                    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
                    WHERE c.relkind IN ('r', 'v', '')
                        AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                        AND pg_catalog.pg_table_is_visible(c.oid)
2010-01-24 01:08:02 CET LOG:  could not receive data from client: Connection reset by peer
2010-01-24 01:08:02 CET LOG:  unexpected EOF on client connection

我该如何修复呢?

这是远程服务器还是本地服务器?您尝试过重新启动PostgreSQL服务器吗? - Felix Kling
这是一个本地服务器,我尝试重新启动PostgreSQL服务器但没有结果。 - user234090
1
我曾经遇到过类似的问题——它是由于在我的应用程序中尝试聪明地使用 init.py 导致的。在那里,我导入了我的表单和测试(以便 runserver 和 django-autotest 可以捕获它们)。通过将这些内容包装在一个 if 块中,并检查 argv 是否包含我想要的服务器命令,问题得到了解决。 - Stuart Axon
5个回答

0

mySQL在遇到错误时不会使当前事务无效,而Postgres则会抛出错误并且不会执行其他查询,直到当前事务被中止。在这种情况下,您必须使用该事务ID终止或提交该事务。


嗨,Praveen, 你有关于PostgreSQL事务的一些指针吗?如何找到打开的事务,提交或回滚它们? - user234090


0

尝试像这样重置您的数据库:./manage.py reset your_app


0

我曾经遇到同样的问题,并追踪到 django-mingus 上提交的 2979ea3d4541f7b3c51c17e160bc95b468ac999b。

如果你回退到 2f7eb8de7e2cb1c776e801a40f008048fcbb6d36 这个提交,同步就应该可以正常进行。


感谢您确认问题。 - user234090

0
这个问题的原因是 Django-Mingus 使用了 django-request,而在 syncdb 过程中 Django 进行了一些数据库内省操作,相关的导入引发了此异常。如果你从 django-request 或 django-mingus 拉取最新的代码,问题就会得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接