【问题标题】:Database trouble in Django: can't reset because of dependenciesDjango中的数据库问题:由于依赖关系而无法重置
【发布时间】:2010-12-14 17:53:48
【问题描述】:

我正在尝试在 Django 中重置数据库,使用:

python manage.py reset app

但得到以下错误:

Error: Error: app couldn't be reset. Possible reasons:
  * The database isn't running or isn't configured correctly.
  * At least one of the database tables doesn't exist.
  * The SQL was invalid.
Hint: Look at the output of 'django-admin.py sqlreset app'. That's the SQL this command wasn't able to run.
The full error: cannot drop table app_record because other objects depend on it
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

这就是我的 models.py 文件的样子:

class Record(models.Model):
    name = models.CharField(max_length=50, db_index=True)
    year = models.IntegerField(blank=True, null=True)
    def __unicode__(self):
        return self.name

class Class(models.Model):
    record = models.ForeignKey(Record)
    def __unicode__(self):
        return self.id

我知道我需要在删除和重新创建数据库的 SQL 中使用 DROP... CASCADE 命令(django-admin.py 的输出)。

但是如何直接从 models.py 中编辑该 SQL?


更新

好的,我想出了如何手动删除表(数据库是 postgres),在这里为有同样问题的人记录了它:

python manage.py dbshell 
# drop table app_record cascade; 
# \q 
python manage.py reset app 

仍然想知道是否有人有更好的方法来做到这一点:)

【问题讨论】:

  • 你输入什么命令来得到它? python manage.py reset app?或者您是否尝试重置特定表?
  • 对不起 - 是的,“python manage.py reset app”。
  • 一个简单的解决方案就是手动使用 DROP... CASCADE 命令,然后重新创建数据库... 谁能给我一个例子来说明如何做到这一点?
  • 好的,我想出了如何手动操作(数据库是 postgres),在这里为任何有同样问题的人指出:python manage.py dbshel​​l # drop table app_record cascade; # \q python manage.py reset app 仍然想知道是否有人有更好的方法,不过:)

标签: sql django


【解决方案1】:

完全重置 Django 数据库的简单方法是使用django-extensions

它有一个reset_db 命令,支持所有 Django 的默认数据库后端。

python manage.py reset_db

如果您使用的是 Django 1.2+,您应该明确定义要重置的数据库。如果你的项目只使用一个数据库,你可能应该设置--router=default

【讨论】:

  • 实际上这也不适用于 heroku 共享数据库(这就是我遇到这个问题的原因)。
  • 该问题专门要求重置应用程序,而不是整个数据库。在我看来,这不是一个好的答案。
【解决方案2】:

我使用一个小的 unix 管道,将 CASCADE 添加到所有 DROP 语句中。

python manage.py sqlreset myapp | sed 's/DROP TABLE \(.*\);/DROP TABLE \1 CASCADE;/g' | \
psql --username myusername mydbname

【讨论】:

  • 这太棒了。另外,可以使用manage.py dbshell 而不是psql --username myusername mydbname
【解决方案3】:

DROP TABLE CASCADE 的问题在于它只是删除了相关表上的外键——在 syncdb 之后,这个关系没有重新创建。 我发现无法重新创建特定模型的表,所以我通过重新创建架构来重置整个应用程序:

  DROP SCHEMA public CASCADE;
  CREATE SCHEMA "public" AUTHORIZATION "owner of database";

这应该只适用于支持架构的数据库,例如PostgreSQL

【讨论】:

    【解决方案4】:

    使用其他答案中的详细信息,我制作了一个 bash 函数,并将其放入 ~/.bash_profile(在 Mac OS X 上)。

    django_reset () { python mainsite/manage.py sqlreset "$*" | sed 's/DROP TABLE \(.*\);/DROP TABLE \1 CASCADE;/g' | mainsite/manage.py dbshell ; }
    

    然后只需在终端中从根代码目录运行此命令(这样 mainsite/manage.py 的路径才有意义)。

    django_reset myappA myappB
    

    它会执行!

    【讨论】:

      【解决方案5】:

      我找到了另一种方法。我正在使用 Django 中默认提供的 sqlite3。 将表重置为默认值。 python manage.py flush --database=default 在此之后,您将需要再次使用 syncdb 命令。

      【讨论】:

        猜你喜欢
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 2014-03-07
        • 1970-01-01
        • 2020-10-14
        相关资源
        最近更新 更多